结构体
结构的基础知识:
结构是一些值的集合,这些值称为成员变量,成员变量可以是不同类型的。
此时s1,s2为全局变量。
特殊的声明:
匿名结构体类型
只能用一次,创建之后直创建变量,因为没有名字,无法再在main函数中再创建变量。
结构的自引用
struct Node
{
int data;
struct Node* next
};
结构体也可以乱序初始化。
int main()
{
struct Point p3 = {1,2};
struct S s = { 100, 'w', {2,5}, 3.14f};
struct S s2 = {.d=1.2f, .p.x=3,.p.y=5, .ch = 'q', .num=200};
printf("%d %c %d %d %f\n", s.num, s.ch, s.p.x, s.p.y, s.d);
printf("%d %c %d %d %f\n", s2.num, s2.ch, s2.p.x, s2.p.y, s2.d);
return 0;
}
结构体内存对齐
要想节省空间,又要保证对齐,就要尽量保证占用内存小的成员放在一起。
*数组在对齐中把数组理解为同类型的多个元素。
修改默认对齐数
VS环境之下默认对齐数是8.
#pragma pack()
此预处理指令可以修改默认对齐数。
结构体传参
首选传地址的方式
位段
位段的成员必须是int,unsigned int,signed int.
成员名后有一个冒号和一个数字。
位段中的位指的是二进制位。数字代表的是所需此类型的比特位,会大大节省空间。
例如 int a:1 即内存只占用一个比特位的空间。
位段的作用与结构体类似。但位段是不跨平台的,注意可移植的程序避免使用位段。
但数字不能大于前边类型的大小。
位段是按照需求系统开辟内存(即一个字节不够用了,系统才会再开辟一个字节)。