结构体(总结)

张开发
2026/4/16 10:07:05 15 分钟阅读

分享文章

结构体(总结)
目录一、结构体类型的设计二、结构体的声明三、结构体的定义和初始化。四、结构体成员访问五、结构体指针六、结构体与数组七、结构体类型的大小C语言提供了基本的数据类型如charshortintfloatdouble...等类型我们称之为内置类型。可以使用结构体来封装一些属性设计出新的类型在C语言中称为结构体类型。一、结构体类型的设计二、结构体的声明在C语言中结构体是一种数据类型。可以用结构体来存放一组不同类型的数据例如注在C语言中Room是结构体名不能定义变量指针数组等。而struct Room是结构体类型名能够定义变量指针数组等。在C语言中Room是类型名。typedef可以为数据类型定义新的型名这样给struct Room起了一个新的名字是room。之后用room定义变量。三、结构体的定义和初始化。结构体是一种数据类型是创建变量的模板不占用内存空间结构体变量才包含了实实在在的数据需要储存空间。结构体的初始化在定义后可以直接利用{ }进行逐一赋值按照顺序或者利用点.访问进行赋值也可以利用指针-)进行逐个赋值后面会说的。例如我们定义一个结构体并进行初始化四、结构体成员访问如果我们要给一个结构体赋值或者要改变结构体中的成员变量我们要进行成员访问。如果不是指针类型的结构体变量我们要用点.)访问的形式来就是在结构体变量名后加一个点.再接着写访问成员的名称。例如我们想要改变结构体中成员用结构体变量.成员名称的格式就可以进行赋值或改变。如果是指针类型的话我们可以进行访问用到-运算符详细我们在下面具体讲。五、结构体指针在C语言中基本类型能够定义指针变量结构体类型也可以定义结构体类型指针。结构体指针的作用是可以间接地引用结构体变量。结构体类型指针访问成员变量的获取和赋值形式1.*p.成员名.的优先级高于**p两边的括号不能少所以*p.成员名访问是不能通过编译的语法错误。2.还可以使用指向符-访问结构体变量成员p-成员名-是减号加大于号中间没有空格称为指向符示例:用第一种方式改变了room1中的房间号和价格。用第二种方式改变了房子的类型。六、结构体与数组所谓结构体数组是指数组中的每个元素都是一个结构体类型。在实际应用中C语言中结构体类型数组常被用来表示一个拥有相同数据结构的群体。示例这样我们就定义一个为Room为结构体类型的数组。七、结构体类型的大小这个结构体A的大小是char a1字节int b4字节char c1字节吗答案是错误的。那到底如何计算结构体的大小呢由于存储变量地址对齐的问题计算结构体大小的3条规则1.结构体变量的首地址必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍2.结构体变量中的每个成员变量相对于结构体首地址的偏移量都是该成员基本数据类型所占字节数的整数倍3.结构体变量的总大小为结构体变量中“最大基本数据类型成员所占字节数”的整数倍根据上个代码我们分析假设从0地址开始char a占一个字节因为1不是4的整数倍所以要填充三个字节因为44是1的倍数所以4419但是9不是int4字节的倍数所以sizeA12字节如果结构体嵌套的话char arr[10]char brr[8]不是结构体A a中最大基本类型int4字节的整数倍所以填充2字节因为108212因为是double的整数倍所以10821284040也是double的整数倍所以sizeofB40字节。对齐问题为什么要理解字节对齐问题1.内存大小的基本单位是字节理论上来讲可以从任意地址访问变量但是实际上cpu并非逐字节读写内存而是以2,4或8的倍数的字节块来读写内存因此就会对基本数据类型的地址作出一些限制即它的地址必须是2,4,或8的倍数。那么要求各种数据类型按照一定的规则在空间上排列这就是对齐2.有些平台每次读都是从偶地址开始如果一个int型假设为32位系统如果存放在偶地址开始的地方那么一个读周期就可以读出这32bit而如果存放在奇地址开始的地方就需要2个读周期并对两次读书的结果的高低字节进行拼凑才能得到该32bite数据。显然在读取效率上下降很多3.由于不同平台对齐方式可能不同如此一来同样的结构在不同的平台其大小可能不同在无意识的情况下互相发送的数据可能出现错乱甚至引发严重的问题指定对齐1.结构体变量的首地址必须是MIN{“结构体最大基本数据类型成员所占字节数”指定对齐方式}大小的整数倍2.结构体每个成员相对于结构体首地址的偏移量都是MIN{基本数据类型成员指定对齐方式}大小的整数倍数3.结构体总大小为MIN{结构体“最大基本数据类型成员所占字节数”将嵌套结构体里的基本类型也算上得出最大基本数据类型成员所占字节数指定对齐方式}大小的整数倍指定对齐值预处理指令#pragma packn可以改变默认对齐数。n取值为124816#pragma packn需要以#pragma pack做结束表示该种对齐方式至此为止。vs中默认值8gcc中默认值4示例。char a1字节是1的倍数int b4字节也是1的倍数char c1字节也是1的倍数 所以sizeofA1416字节。

更多文章