一、发明结构体的初衷
人们发现很多不同的数据类型之间不是互相独立的而是互相关联的,比如一位学生的姓名、学号、成绩等数据。显然,把这些数据放在一起管理起来会轻松不少,但数组满足不了这个需求,因为数组只能存放同一类型的数据,所以就出现了结构体,千万不要忘了最后的分号。
struct Student
{
char name[20];
int num;
int score[5];
};
经过上面的指定,struct Student就是一个在本程序中可以使用的合法类型名,将Student称为结构体标记以区分不同的结构体类型。它和系统提供的标准类型int、char、float、double等具有类似的作用,都可以用来定义变量。.
格式如下:struct Student student_1;
二、结构体变量的引用
格式如下:结构体变量名.成员名
“.”是成员运算符,拥有最高运算优先级。如果成员本身又属于一个结构体类型,则要用成员运算符逐级找到最低一级的成员。
student_1和student_1.num都是变量名,与一般数据类型定义的变量没有差异。&student_1输出的是这个结构体变量在内存中的首地址,&student_1.num输出的是成员变量num在内存中的地址。
三、结构体指针
指向结构体对象的指针变量既可指向结构体变量,也可指向结构体数组中的元素。指针变量的基类型必须与结构体变量的类型相同。
例如:struct Student *pt; //pt可以指向struct Student类型的变量或数组元素。
(*p).num与student_1.num与p->num等效,*p等价于student_1,->是指向运算符
四、指向结构体数组的指针
一定要注意,结构体数组相当于普通的一维数组,不存在一级指针、二级指针这样的分别。在应用指针时,只要把结构体数组类比于一维数组即可。
在上文已经提到*p等价于student_1,在结构体数组当中p[i]等价于*p。
关键还是在于通过(*p),p[i]将其效果等价到student_1这里,那么应用起来就得心应手了。现在看来[ ]跟在汇编语言中一样具有寻址的功能,当然这只是一个比喻。