结构体的定义struct stu{int a ; char b; double c;struct stu *p ;}s1,s2;
这里的s1,s2为全局变量,当结构体自引用时,需要引用地址,而不是成员,当引用成员时,会造成死递归的现象,无法计算结构 体的大小; 当时用指针引用自身的时候,可实现数据链表的结构;
关于结构体的大小:C语言标准:结构体在定义成员时第一个成员偏移量(偏移量为0),第二个成员开始,成员放在其对齐数的整数倍地址上,对齐数为成员大小与默认对齐数之间的最小值,且最终结构体的大小为结构体内部最大对齐数的整数倍;当含有嵌套结构体时,嵌套结构体的对齐数为其结构体内部的最大对齐数;
这种现象为内存对齐,这是C语言的标准规定,原因一般解释为两类,硬件限制导致硬件只能读取特定位置的数据,性性性性性性性 性能原因,假设计算机一次读四个字节,那么固定对齐之后,能使计算机不重复读取,提高效率。
结构体传参优先使用结构体指针; 内存占用小,可执行的操作也更多;
结构体的位段: 位段的成员必须是整型家族int ,unsigned int,或者char 生命方法 char _a: 2; 表明a占用两个比特位.
在编译器当中,使用位段功能之后 ,假如 a=2; 此时内存当中 00000000变为00000010或者10000000由编译器决定,VS当中, 为从右向左,且当旧空间不够时,直接使用新空间。
在不同编译器中,当初始开辟的字节不足够来放下下一个内存数据是,会新开辟的空间,而有些编译器会让新空间存储全部下个一内存数据,而有些编译器只会存储一部分数据,将另一部分数据存放在之前开辟的空间当中,因因因因因因因因因因此跨平台的程序, 不建议使用位段功能。