结构体
1. 概念
结构体:自定义数据类型。
结构体变量是由多个其他变量组成的复合变量。多个变量的类型可以不同,而且每一个变量都有自己的名字。
2. 结构体定义
- 一般的定义方式:
- 常用的定义方式:
3. 结构体变量的初始化
4. 赋值(逐个赋值)
结构体成员变量的访问有两种形式:一种是用符号"."(通用),一种是用符号"->"(一般是结构体指针变量用)。
5. 结构体所占内存空间
关于结构体内存对齐规则: #pragma pack(n) 这个宏表示设置为n字节对齐(VC6默认8字节对齐)
- 对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(n, 该成员的大小)的倍数。(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
- 在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,总大小必须是min(n, 最大成员的大小)的倍数,不足的要补齐。
- 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)
首先明确一点:结构体中的成员是从低地址向高地址排列的,这一点和数组类似,即排在结构体前面的成员占用内存低地址,排在结构体后面的成员占用内存高地址。
6. 构造类型: 数组/ 结构体
- 数组: 是用于保存一组相同类型的数据
- 结构体: 是用于保存一组不同类型的数据
联合体 union
1. 概念
union,中文名“联合体、共用体”。联合体的用法、语法和结构体非常相似。
- 联合体所占用的内存空间大小等于最长的成员所占用的字节数。
- 联合中所有的成员都共享同一片内存空间。(联合体使用了覆盖技术,几个成员变量相互覆盖,从而使几个不同变量共占同一段内存)
- 联合体只能存放一个成员变量的值。(对新的成员变量赋值,就会把原来成员变量的值覆盖掉)
- 联合体union的存放顺序是所有成员都从低地址开始存放的。
2. 定义
联合语法格式:(与结构体一样)
//共用体 data 中,成员 i 所占用的空间最大,为 4 个字节,所以 data 类型的变量(也就是a、b、c)也占用4个字节的内存。
- 对某一个成员赋值,会覆盖其他成员的值(因为他们共享一块内存。但前提是成员所占字节数相同,当成员所占字节数不同时只会覆盖相应字节上的值,比如对char成员赋值就不会把整个int成员覆盖掉,因为char只占一个字节,而int占四个字节)
- 为什么要引入联合体:
结构体内存空间的分配是粗放的,不管用不用,全分配;联合体内存使用更为精细灵活,节省内存空间。
枚举
定义:
C语言提供了一种枚举(enum)类型,可以列出所有可能的取值。定义形式为:
enum 枚举名{ 标识符1[=整型常数], 标识符2[=整型常数], ... 标识符n[=整型常数]};
注意:枚举值是标识符,要注意命名格式!