1.问题描述
学习C/C++等语言的伙伴经常遇到结构体这一词,如下所示表示 日期 的一个结构体:
struct Date{
int year; //年
int month; //月
int day; //日
}a,b,*p; //定义 结构体变量a和b,结构体指针变量p
数据的定义不会感到不好理解,问题是使用:点运算符(“.”) 还是 箭头运算符(“->”) 调用内部成员 ?
特别是当涉及到链式存储的时候常常需要 指针运算符(“->”) 和 点运算符(“.”) 相互配合访问数据,分清两种运算符的作用实质,就可以自然的正确运用运算符访问数据。
概述:" 访问结构体成员用 " . " 点运算符,访问结构体指针的成员用 " -> " 箭头运算符 "。
2.优先级
在 C 语言中," .
"(点运算符)和 " -> "(箭头运算符)具有相同的优先级,且结合性是从左向右。当它们在同一个表达式中出现时,按照从左往右的顺序依次计算。
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中的成员数据。
综合即可通过 s 调用 birthday,然后 birthday 调用自身的成员 year,形成 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访问指针数据时使用 指针运算符(“->”)。
我们使用结构体指针p访问内部成员,因此使用 " -> " 箭头运算符。 日期结构体变量birthday嵌套在student中,对student而言birthday是一个普通的结构体变量成员,因此用“.”运算符即可访问日期结构体变量birthday中的成员数据。
反过来,如果是 结构体普通变量 内部包含结构体指针变量。通过 结构体普通变量 使用 “点运算符”调用内部结构体指针变量成员,然后再使用 “箭头运算符”调用结构体指针变量成员内部元素即可。(说明: 这样的情况是不同 结构体变量 互相嵌套作为成员的情况,当你明白不同的 结构体变量类型 使用的 “运算符” 即可清晰的知道如果调用对应的成员)
因此,对于 结构体指针变量用箭头运算符访问内部成员,即“结构体指针变量->内部成员” 。
4.小结
通过上述实例,主要区分为:
“.”
用于直接访问 结构体或联合体的成员,“->”
用于访问结构体 指针的成员 。
对于复杂的情况常见的是 " 不同 结构体变量 嵌套作为 另一结构体成员 的情况 ":
1.分清楚是什么类型的 结构体变量。
2.这种类型的结构体变量是 使用 " .
"(点运算符)和 " -> "(箭头运算符)调用内部成员。
基本上就是这个过程。