目录
结构体
例子
大小
联合体
例子
大小
枚举
例子
大小
结构体
结构体就是我们自己发明的数据类型,因此使用结构体至少包含两个步骤: 第一,创建一个自定义的结构体类型。 第二,用这个自己搞出来的类型定义结构体变量
// 1,创建一个结构体模板 student,包含姓名、年龄和分数
struct student
{
char name[32];
int age;
float score;
};
// 2,使用 student 模板定义两个结构体变量
struct student Jack, Rose;例子
1 #include <stdio.h>
2 #include <string.h>
3
4 struct student // 结构体模板
5 {
6     char name[32];
7     int age;
8     float score;
9 };
10
11 void show(struct student someone);
12
13 int main(void)
14 {
15     // 定义一个 student 类型结构体变量 Jack,并将成员赋值
16     struct student Jack;
17     strcpy(Jack.name, "Jack"); // 圆点.被称为成员引用符
18     Jack.age = 18;
19     Jack.score = 90.5;
20
21     // 定义一个 student 类型结构体变量 Rose,并进行初始化
22     struct student Rose = {"Rose", 16, 80.0};
23
24     // 对结构体变量 Michael 进行指定成员初始化
25     struct student Michael = {
26         .score = 88.5, 
27         .name = "Michael" 
28     };
29
30     // 定义结构体 Michael_Junior 并直接将 Michael 整个赋值给他
31     struct student Michael_Junior;
32     Michael_Junior = Michael;
33
34     // 定义一个具有 50 个 student 类型结构体变量的数组
35     struct student myclass[50];
36     myclass[0] = Jack;
37     myclass[1] = Rose;
38     myclass[2] = Michael;
39
40     // 定义一个结构体指针 p,并使其指向结构体 Michael
41     struct student *p;
42     p = &Michael;
43
44     // 对结构体指针使用跟普通指针一样,但也可以使用更加方便的箭头
45     (*p).age = 23;
46     p -> age = 23;
47
48     show(&Michael); // 将结构体的地址作为参数传递给函数 show( )
49     return 0;
50 }
51
52 void show(struct student *ptr_someone)
53 {
54     printf("name: %s, age: %d, score: %f\n", 
55         ptr_someone -> name, // 将结构体的成员打印出来
56         ptr_someone -> age, 
57         ptr_someone -> score);
58 }大小
结构体大小要遵循地址对齐

每一款不同的处理器,存取内存数据都会有不同的策略,如果是 32 位的 CPU,一般 来讲他在存取内存数据的时候,每次至少存取 4 个字节(即 32 位),也就是按 4 字节对齐 来存取的。换个角度讲:CPU 有这个能力,他能一次存取 4 个字节。 接下来我们可以想到,为了更高效地读取数据,编译器会尽可能地将变量塞进一个 4 字节单元里面,因为这样最省时间。如果变量比较大,4 个字节放不下,则编译器会尽可能 地将变量塞进两个 4 字节单元里面,反正一句话:两个坑能装得下的就绝不用三个坑。这 就是为什么变量的地址要对齐的最根本原因。

可见,如果对一个 double 型数据的地址不作要求,那么 CPU 就有可能为此付出代价: 需要三个指令周期才能将区区 8 个字节搬到家里来,这显然很不环保,环保的做法是:令 其地址至少是 4 的整数倍(即 4字节对齐)

可以总结出一套这样的规律(假设是 32 位系统):
- 1,如果变量的尺寸小于 4 字节,那么该变量的 m 值等于变量的长度。
- 2,如果变量的尺寸大于等于 4 字节,则一律按 4 字节对齐。
- 3,如果变量的 m 值被人为调整过,则以调整后的 m 值为
一个变量的 m 值规定了这个变量的地址的最小倍数,同时也规定了这个变 量的大小至少是这个 m 值的倍数。m 值不是这个变量的大小。结构体本身也是一个变量, 结构体变量的 m 值取决于其成员中 m 值最大的那个
struct node { short a; double b; char c; }x;
short为2,double为4,char为1,取最大的4为m,所以该x的大小为12

联合体
例子
union example
{
int a;
char b;
double c;
}x;大小
共用体变量 x 的大小等于各成员中的最大值,也就是 c 的大小:8 个字节

枚举
enum spectrum {red, green, blue};
相当于
enum spectrum {red=0, green=1, blue=2};
例子
1 #include <stdio.h>
2
3 // 定义了一个枚举常量列表
4 enum spectrum {red, green, blue};
5
6 int main(void)
7 {
8     enum spectrum color; // 定义了一个枚举变量
9     color = green;
10
11     switch(color)
12     {
13     case red: // 使用枚举常量来判断 color 的值
14         printf("red\n");
15         break;
16     case green:
17         printf("green\n");
18         break;
19     case blue:
20         printf("blue\n");
21         break;
22     default:
23         printf("unknown color\n");
24     }
25
26     return 0;
27 }大小
一般为int型,就为4个字节