结构体(Structure)
又叫聚合体(Aggregate)
是统一在一个名字下的一组相关变量的集合,属于派生数据类型(Derived data type)
特点:可以包含不同数据类型的变量——与数组相反
定义
格式:struct 结构体标记(Structure tag)
{成员} ;
结构体标记:对结构体定义进行命名——可以省略
结构体类型:struct 结构体标记
成员(Member):同一个结构体类型中的成员必须有不同的名字,但两个不同的结构体中的成员可以有相同的名字
引用:一个结构体不能包含它自身类型的实例,但指向同一个结构体的指针可以出现在定义中——自引用结构体(Self-referential structure)
定义不占用内存
声明
- struct 结构体标记
{成员} (变量名);
- struct 结构体标记
变量名;
操作
将结构体变量赋值给其他具有相同类型的结构体变量
用运算符&取得结构体变量的地址
访问一个结构体变量的成员
用运算符sizeof确定结构体变量的大小
提醒:不能用==或!=比较两个结构体——保安未定义数据的字节单元,只能对单个成员进行比较
提醒:
为满足边界对齐的要求,变量大小不等于其成员变量大小之和——用sizeof确定一个结构体变量所占用的内存字节数
在一个结构体变量中,未定义的字节单元可能包含于安全有关的,上次使用这些单元遗留下的数据——应禁止访问
初始化
采用初始值列表—不同的初始值用“,”隔开——若列表中初始值的个数少于结构体成员的个数,则剩余的没有初始值与之对应的成员被自动初始化为0(指针为NULL)
通过赋值语句
对结构体变量的成员分别赋值
访问
结构体成员运算符(Structure member operater),也叫圆点运算符(Dot operater)
结构体指针运算符(Struture pointer operater)(->)——等价于(*变量名).成员名
注意:.和->的两边不要加上空格
在函数中的应用
作为形参传递的方式
传递结构体的个别成员
传递整个结构体
传递一个指向结构体的指针
传递
结构体或其成员按值传递
按引用传递,实际传递结构体变量的地址——效率更高——结构体数组自动按引用传递
通过使用结构体,可以按值传递一个数组——先创建一个以该数组为成员的的结构体,再按传值的方式传递结构体
共用体(Union)
一种派生数据类型
特点:所有成员共享一个存储空间——避免了当前不再使用的变量仍占用内存的浪费
任意数据类型——每次只允许访问一个成员
声明: union 共用体名
{成员名};
操作 1.两个具有相同类型的共用体之间的赋值
2.用&运算符取得一个共用体变量的地址
3.用结构体成员运算符或结构体指针运算符访问共用体成员
提醒:不能用==或!=比较两个共用体
初始化:只能对其成员赋值
位运算符
用于处理有符号或无符号的整形操作数的各个数位
特点:依赖于机器
类型
& 按位与 仅当两个操作数相应的二进制数位都为1时,结果相应的二进制数位为1
| 按位或
若两个操作数相应的二进制数位至少有一个为1,结果相应的二进制数位为1
^ 按位异或 仅当两个操作数相应的二进制数位只有一个为1,结果相应的二进制数位为1
<< 左移 将第一个操作数按位向左移,移动的位数由第二个操作数决定。右边腾出的数位补0
右移 将第一个操作数按位向右移,移动的位数由第二个操作数决定。左边腾出的数位填补方式取决于机器
~ 按位取反 将操作数中所有为0的数位置成1,1的数位置成0
&要与一个掩码(Mask)一起使用——某些特定位被置成1的一个整数——在选取某些数位的同时将其他数位隐藏
提醒:
对int 整数进行某些位操作与系统实现相关,只能对无符号数进行微操作
对一个比int小的整型数据进行按位操作,会出现意想不到的结果
位域(Bit field)
定义:当结构体或共用体中包含无符号整数(unsigned)或有符号整型(int)成员,C允许用户指定这些成员所占用的存储位数
声明:在unsigned和int的成员名字后面加一个:和一个整数——位域的宽度(这个成员将占用的存储位数)
特点:1.有助于减少程序所需的存储空间
2.依赖于机器
无名位域(Unnamed bit field),作为结构体中的补位(Padding)
宽度为0的无名位域(unnamed bit field with a zero width)使下一个位域对齐在一个新的存储单元的边界
枚举常量(Enumeration
constant)
关键字:enum
特点:1.除非专门定义,枚举类型中的枚举值都是从0开始且依次递增1
2.一个枚举类型中出现的标识符必须互不相同
3.一个枚举类型中的多个成员可以拥有相同的常量值——允许多个枚举常量具有相同的值,会导致很难发现的逻辑错误
Typedef
为已定义的数据类型创建同义词
将定义的类型名的第一个字母大写,强调它们是其他类型名的同义词
优点:
更简短
可提供程序的可移植性
提供程序的可读性和可维护性
本文深入解析C语言中的结构体和共用体,包括定义、操作、初始化及在函数中的应用。结构体允许组合不同类型的变量,而共用体则让多个成员共享同一存储空间,有效节省内存。

4000

被折叠的 条评论
为什么被折叠?



