目录
序言
今天主要说的是关于结构体、枚举和联合体的知识点,可能有些枯燥,不过很重要,我尽量说的详细一点
结构体关键字 struct
struct 是声明结构体类型的的关键字,我们在学链表是要经常用到的,所以我分为两个层次来说
初级
这里我们就需要知道怎么定义结构体以及结构体如何格式化输入输出就行
定义一个结构体
struct Peo
{
char name[20];
int age;
};
int main()
{
struct Peo peo = { "zhansan",18 };
return 0;
}
其中peo是一个局部变量,其类型是struct Peo, 这个struct Peo类型就像是我们的之前的int、char一样。
{ “zhansan”,18 }是对peo的初始化,
当让,我们也可以这么写
struct Peo
{
char name[20];
int age;
} s; //s是一个权据变量
格式化输出结构体
#include<stdio.h>
struct Peo
{
char name[20];
int age;
} s;
int main()
{
struct Peo peo = { "zhansan",18 };
printf("%s %d\n", peo.name, peo.age);
return 0;
}
格式化输入结构体
#include<stdio.h>
struct Peo
{
char name[20];
int age;
} s;
int main()
{
struct Peo peo = { "zhansan",18 };
printf("%s %d\n", peo.name, peo.age);
scanf("%s %d", peo.name, &peo.age);
printf("%s %d\n", peo.name, peo.age);
return 0;
}
进阶
结构体传参
#include<stdio.h>
struct Peo
{
char name[20];
int age;
} s;
void test(struct Peo* ps)
{
printf("%s %d\n", ps->name, ps->age);
scanf("%s %d", ps->name, &ps->age);
printf("%s %d\n", ps->name, ps->age);
}
int main()
{
struct Peo peo = { "zhansan",18 };
test(&peo);
return 0;
}
对于结构体指针来说,要是要访问结构体里面的内容,我们使用’ -> ‘来代替’ . ’
结构体的大小
我们都知道,int是4个字节的大小,那么结构体呢?是不是里面字节大小的的和?,这里我就先简略的说一下,详细的可以看下
默认对齐数
这里就提一下,它是一个数值,至于作用后面用到的时候说,VS2019的默认对齐数是8
计算规则
我先说一下,后面一一解释
- 第一个成员在与结构体变量偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 - 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
例一
计算下面结构体的大小
struct S1
{
double d;
char c;
int i;
};
验证一下
例二
结构体里面嵌套另一个结构体
struct S1
{
double d;
char c;
int i;
};
struct S2
{
int i;
struct S1 s;
};
验证一下
枚举关键字 eunm
枚举就是一一列举的意思
enum Color//颜色
{
RED, //0
GREEN, //1
BLUE //2
};
enum Color是一种数据类型 ,编译器会自动成员从0开始从上到下依次+1
enum Color//颜色
{
RED, //0
GREEN, //1
BLUE //2
};
int main()
{
enum Color red = RED;
enum Color green = GREEN;
enum Color blue = BLUE;
printf("%d\n", red);
printf("%d\n", green);
printf("%d\n", blue);
return 0;
}
枚举的大小
大小是4个字节
enum Color//颜色
{
RED = 5,
GREEN = 9,
BLUE
};
int main()
{
printf("%d", sizeof(enum Color));
return 0;
}
枚举的作用
很难说清楚,可以放在switch语句中
enum Calc
{
EXIT,
ADD,
DEL
};
void menu()
{
printf("**************************\n");
printf("**** 1.ADD 2 DEL ****\n");
printf("**** 0.EXIT ****\n");
printf("**************************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case ADD:
printf("加法函数\n");
break;
case DEL:
printf("减法函数\n");
break;
case EXIT:
printf("已退出\n");
break;
}
} while (input);
return 0;
}
问题一
下面的代码会打印出啥
enum Color//颜色
{
RED = 5,
GREEN = 9,
BLUE
};
int main()
{
enum Color red = RED;
enum Color green = GREEN;
enum Color blue = BLUE;
printf("%d\n", red);
printf("%d\n", green);
printf("%d\n", blue);
return 0;
}
联合体(共生体)关键字 union
联合体就是几个成员共用最大的的那个成员的空间,大小自然是最大成员的大小
union U
{
int i;
char ch;
} u;
int main()
{
printf("%p\n", &u);
printf("%p\n", &u.ch);
printf("%p\n", &u.i);
return 0;
}
特征
- 联合体的成员同一时间只能使用一个
- 改变其中一个成员的值都会改变其他的
例三
union U
{
int i;
char ch;
} u;
int main()
{
u.i = 0x11223344;
printf("%#x", u.ch);
return 0;
}