【零基础学C语言】知识总结九:struct 结构体与 union 共用体

如题所述

结构体是一种数据类型,用于描述包含多种不同类型数据的对象。例如,描述学生信息时,使用学号、姓名、性别等数据,将它们封装到一个“文件夹”中,通过使用关键字 "struct" 声明。在定义和使用结构体之前,必须先声明它。

结构体内部包含多个变量或数组,类型可相同也可不同,每个称为成员变量。结构体的成员可以包含其他结构体或指向自身结构体类型的指针,常用于实现高级数据结构如链表和树。结构体的定义形式为:`struct 结构体名 {成员类型1 成员名1; 成员类型2 成员名2; ...};`。

数组与结构体的使用方式不同,数组通过下标访问元素,而结构体则通过点号 . 访问成员。数组使用`a[0]=10;`赋值,结构体使用`today.day`。结构体成员可嵌套其他结构体,甚至包含指向自身的指针。

定义结构体时,注意遵循以下规则:
1. 结构体本身不占用内存,真正占用的是结构体变量。
2. 先声明结构体类型,再定义变量,否则需分配内存。
3. 尽量使用占用空间少的类型,例如使用`short`代替`int`。
4. 结构体成员赋值可用逐一赋值或整体赋值(仅在定义时)。
5. 结构体之间不能进行算术运算,但可以整体赋值或赋值给其他结构体变量(要求结构体类型相同)。

结构体可以嵌套结构体,实现更复杂的数据组织。结构体也可以相互引用,形成循环依赖关系。但需注意引用顺序,先定义结构体类型,避免未定义的类型错误。

结构体作为函数参数,可以传入整个结构体或通过指针引用。用结构体变量作函数参数时,数据通过值传递方式传输,即复制结构体变量内容。结构体本身可以作为函数返回值。

结构体数组是数组中的每个元素都是一个结构体。用于表示具有相同数据结构的群体,如学生或职工信息。定义和初始化结构体数组类似于普通数组,可连续存储多个结构体。结构体数组的内存对齐方式遵循特定平台的默认规则或通过`#pragma pack`调整。

结构体指针可以指向结构体变量,通过`*`运算符访问结构体内容,通过`->`运算符访问成员。结构体和结构体变量是不同概念,结构体是创建变量的模板,结构体变量包含实际数据。

结构体指针可以指向结构体数组,数组名赋给指针后,指针指向数组首地址,通过指针可访问数组元素。每个元素都是结构体变量。

使用`typedef`为复杂类型定义简短别名,提高代码可读性,如`typedef int myInt;`。别名与宏定义不同,作用范围限制在定义的函数或文件内。

结构体的内存对齐方式是其元素按对齐系数分配内存,对齐系数决定了元素在内存中的位置。对齐方式优化内存访问速度,通常受CPU读取粒度影响。`#pragma pack`允许修改默认对齐系数,影响结构体大小。

联合体(共用体)允许几种不同类型的变量共享同一段内存,每次只能赋值给一种类型,赋值后其他成员失效。联合体可用于节省内存或实现数据类型转换。访问联合体成员使用`.`或`->`运算符。

联合体实例化前不能作为函数参数或返回值,但可以使用指向联合体的指针。联合体的内存对齐和结构体类似,但以最长成员长度为准进行对齐。

通过`#pragma pack`可以调整结构体和联合体的对齐方式,优化内存使用和性能。调整对齐系数时,需考虑对齐规则和CPU架构。

理解结构体和联合体的使用,有助于更高效地组织和处理复杂数据结构,提高程序的灵活性和可读性。
温馨提示:答案为网友推荐,仅供参考
相似回答
大家正在搜