1.用户先定义结构体的类型,要用到struct关键字,如下图:
这里的stu表示student的简写,创建这个结构体的目的是打印学生的信息,然后我们在结构体中(花括号里)写出结构体中的成员(它们可以是不同类型的变量,可以为标量,数组,指针,其他结构体,而数组内只能是相同类型的集合,这点和结构体是不一样的),如下图:
这里圈出来的三个圈,student和a都是用户定义的结构体变量,但student是全局变量(全局变量未定义默认为0),a是局部变量。而86.6后面加f是为了避免编译器识别时把单精度浮点数识别成双精度浮点数,我们在这里看看他的实现结果吧:
2.结构体的成员里有结构体时,无非就是再创建一个新的结构体,并把新的结构体类型和变量写入这个结构体中(类似多级指针层层叠进,之前发的博客有写到,可以去看看),如下图:
显然其结果为:
3.关于结构体的成员如何调用:
A:结构体类型变量访问结构体中成员时,使用.操作符
B:指向结构体类型变量的指针访问结构体中成员时,使用->操作符
C:指向结构体类型变量的指针也可以通过.方式访问成员,只不过要先通过*对该指针解引用
如下图:
显然B是错的,结构体类型变量需要访问其成员时,用.运算符,如果是指向结构体变量的指针访问时,需要用->,或者先对指针解引用,用*操作符,取到指向的结构体类型的变量,再通过.访问,但是要注意优先级 ,因为*优先级没.运算符高,所以先用括号运算符把*括起来,是其先进行解引用,再访问。
4.最后一个重要的小点,最好调用结构体变量时传地址(->,(*p))如果调用结构体变量的话,因为其结构体空间本身非常大,但里面的结构体成员所占内存并不大,且栈区是先进后出,所以会导致压栈严重,性能下降严重,所以最好用指针,因为指针在32位环境下只占4个字节(64位环境下8个)
其结果如下:
所以朋友们,尝试结构时,尽量不要直接调用结构体,多用用指针哦。