目录
结构体
例子
大小
联合体
例子
大小
枚举
例子
大小
结构体
结构体就是我们自己发明的数据类型,因此使用结构体至少包含两个步骤: 第一,创建一个自定义的结构体类型。 第二,用这个自己搞出来的类型定义结构体变量
// 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个字节