C语言结构体--指针运算符(“->”)和点运算符(“.”) 应用区分

1.问题描述

        学习C/C++等语言的伙伴经常遇到结构体这一词,如下所示表示 日期 的一个结构体:

        struct Date{

                int year; //年

                int month; //月

                int day; //日

        }a,b,*p; //定义 结构体变量a和b,结构体指针变量p

        数据的定义不会感到不好理解,那么唯一的问题就是“调用结构体数据”时应使用:指针运算符(“->”) 还是 点运算符(“.”) ???

        特别是当涉及到链式存储的时候常常需要 指针运算符(“->”) 和 点运算符(“.”) 相互配合访问数据,其实这并不复杂,分清楚两种运算符的作用实质,就可以自然的正确运用运算符访问数据。

        先看一句话留下印象:“ 访问指针变量元素用 -> 指向访问结构体变量用 “.”指向 ”。

扫描二维码关注公众号,回复: 14286953 查看本文章

2.优先级

(1)“.”  是分量运算符,运算级别最高。

(2)“->”  是指向结构体成员运算符,优先级为一级

3.实例分析

(1)“.” 运算符访问结构体成员

        ------->>>>结构体“变量”用点运算符访问,即“变量名.元素” ,如下代码内容:

#include<stdio.h>

//日期结构体 
struct Date{
	int year;//年 
	int month;//月 
	int day;//日 
};

//学生信息结构体 
struct student {
	int number;//学号 (为简洁理解,在这里只用学号一个数据来表示,当为多个类型数据方法相同) 
	struct Date birthday; //生日,  在学生结构体中嵌套日期结构体变量birthday
	
}s;//定义一个学生结构体类型的变量 s 

int main(){
	s.number=12;//为学生结构体类型的变量 s 中的学号number数据赋值 
	s.birthday.year=6666;//年 
	s.birthday.month=77; //月 
	s.birthday.day=88;//日 
	
	//输出信息———使用 “. ”运算符 
	printf("学生学号:%d,生日:%d---%d---%d",s.number,s.birthday.year,s.birthday.month,s.birthday.day); 
	return 0;
}

         运行结果如下:

        在上述实例中,定义日期结构体和学生信息结构体,其中日期结构体嵌套在学生结构体中,定义了学生结构体变量s,因为这是结构体变量,因此访问其元素直接使用“.”运算符即可。

        因为日期结构体变量birthday嵌套在student中,对student而言birthday是其一个元素因此用“.”运算符访问。   而birthday中包含year、month、day三个元素,所以birthday用“.”运算符访问即可,综合到一起则为“ s.birthday.year ”形式。

        因此,对于 结构体“变量”用点运算符访问,即“变量名.元素” 。

(2)“->” 运算符访问结构体成员

        --->>>  结构体“指针变量”访问结构体中成员(元素)用 指针运算符 访问,即“指针名->元素” ,如下代码内容:

#include<stdio.h>

//日期结构体 
struct Date{
	int year;//年 
	int month;//月 
	int day;//日 
};

//学生信息结构体 
struct student {
	int number;//学号 (为简洁理解,在这里只用学号一个数据来表示,当为多个类型数据方法相同) 
	struct Date birthday; //生日,  在学生结构体中嵌套日期结构体变量birthday
	
}s,*p=&s;//定义一个学生结构体类型的 变量s 和 指针变量 p,并对p赋值,使p指向s 

int main(){
	p->number=12;//为学生结构体类型的变量 s 中的学号number数据赋值 
	p->birthday.year=6666;//年 
	p->birthday.month=77; //月 
	p->birthday.day=88;//日 
	
	//输出信息———使用 “. ”运算符 
	printf("学生学号:%d,生日:%d---%d---%d",p->number,p->birthday.year,p->birthday.month,p->birthday.day); 
	return 0;
}

        运行结果如下:

        在上述实例中,定义日期结构体和学生信息结构体,其中日期结构体嵌套在学生结构体中,定义了学生结构体变量s和指针变量p并用s的地址初始化指针p,因为p是指针变量,所以通过p访问指针数据时使用​ 指针运算符(“->”)。

        因为日期结构体变量birthday嵌套在student中,对student而言birthday是其一个元素因此用 指针运算符(“->”)访问。   而birthday中包含year、month、day三个元素,所以birthday用“.”运算符访问即可与student不是直接作用关系,综合到一起则为“ p -> birthday . year ”形式。(可以看到涉及到了指针运算符 和 点运算符一起作用于数据。)

        因此,对于 结构体“指针变量”用指针运算符访问,即“指针名->元素” 。

4.小结

        通过上述实例,主要区分为: 访问指针变量元素用 -> 指向访问结构体变量用 “.”指向 

猜你喜欢

转载自blog.csdn.net/m0_54158068/article/details/125339307