通俗讲解C语言的 struct enum union
1)struct
最为常见的结构体,其更倾向于将我们所需要的多种数据类型整合成为一个整体,方便使用者的调用和理解。
可以极大的提高代码的可读性。
学习struct结构体需要从两个方面去理解。
1.struct的定义格式
我认为有3种格式,各有优缺点
//第一种格式定义方便,但是在调用时非常不方便,
struct student_type_1
{
int number;
char sex;
}; // <-别忘了分号!
//如果要调用这个结构体,应该像这样,每次前面要加struct,太麻烦了。
int main(void)
{
struct student_type_1 test1 = { 111,'M'};
}
//第二种,我个人是最喜欢用的,非常清晰,而且用了typedef关键字
//这样在主函数中调用时不过可以不写struct,还可以给这个结构赋予其他的名字
typedef struct student_type_2
{
int number;
char sex;
}type2;
int main(void)
{
student_type_2 test2_1 = { 112,'M' };
type2 test2_2 = { 113,'M' };
}
//第三种是隐式调用,和第二种很像,不过忽略了直接的结构体命名,
//更注重强调的是这种变量的别名和成员组成
//对比之下,第二种更强调结构体的种类
typedef struct
{
int number;
char sex;
}student_type_3, type3;
int main(void)
{
student_type_3 test3_1 = { 114,'M' };
type3 test3_2 = { 115,'M' };
}
struct的访问
结构体的访问,有两种模式
1)用"."符号直接访问
用上面的案例
typedef struct student_type_2
{
int number;
char sex;
}type2;
int main(void)
{
student_type_2 test2_1 = { 112,'M' };
type2 test2_2 = { 113,'M' };
printf("%d", test2_1.number);
}
2)利用指针访问
typedef struct student_type_2
{
int number;
char sex;
}type2;
int main(void)
{
student_type_2 test2_1 = { 112,'M' };
student_type_2* test2_1_pointer = &test2_1;
printf("%d", test2_1_pointer->number);
}
2)枚举 enum (enumeration)
枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量。这是网上的解释.
我感觉这个解释不太方便理解。
首先,它是结构体,这说明它是可以定义的。
我的解释就是。枚举就是在定义一堆常量,而且常量的值是自动分配好的,我只用管常量叫什么就好,取值的时候通过常量名直接取值。
多说无益,直接上案例:
typedef enum
{
LIN_DAN, //无论写的什么常量名,这里的常量值按顺序从0依次递增。LIN_DAN为int型的0
VIKTOR_AXELSEN,//为 int型的1
SHI_YU_QI,//为 int型的2
JONATAN,//为 int型的3
ANTONSEN//为 int型的4
}Badminton_Rank;
int main(void)
{
Badminton_Rank now = VIKTOR_AXELSEN;
printf("%d\n", now);//说明VIKTOR_AXELSEN的值是1,就是now的值
//既然常量可以用int替代了,那吗switch-case语法就可以大显身手了
switch (now)
{
case 1: puts("安赛龙世界排名是1"); break;
case 2: puts("石宇奇世界排名是2"); break;
case 3: puts("乔纳坦世界排名是3"); break;
case 4: puts("安东森世界排名是4"); break;
default:break;
}
}
其实枚举能做到的,直接定义常量也可以做到,但枚举更美观而且方便老师出题,最重要的是可以提高代码的可读性,面对庞大复杂的文件,枚举的使用可以降低理解代码的难度。
联合union
联合型结构体比较少见。
它更注重成员变量类型
union中可以定义多个成员,union的大小由最大的成员的大小决定。 可用sizeof验证。
union成员共享同一块大小的内存,一次只能使用其中的一个成员。 可直接用取地址符&验证。
对某一个成员赋值,会覆盖其他成员的值(也不奇怪,因为他们共享一块内存。但前提是成员所占字节数相同,当成员所占字节数不同时只会覆盖相应字节上的值,比如对char成员赋值就不会把整个int成员覆盖掉,因为char只占一个字节,而int占四个字节 这个解释引用自 博客园的大佬 十日十乞)
如果说struct型结构体是公务员考生名单上所有人上岸了,都有用到了。
那union型结构体是只指定公务员考生名单中的一位暂时录取使用。如果后面有需要的话就把刚刚那个人换掉,换上名单上能力更适合的另一位考生干活,这样可以充分节约岗位资源(内存)
还是上案例,搭配上面的解释,想必会更容易理解
typedef union
{
int int_value;//考生1
char char_value;//考生2
}Data;
int main(void)
{
//共用体变量不可以在定义的同时初始化。
Data m;
int temp1 = 65;//考试的科目为:INT
m.int_value = temp1;
printf("%d\n", m.int_value);
printf("%c\n", m.char_value);
char temp3 = 'a';//考试的科目为:CHAR
m.char_value = temp3;
printf("%d\n", m.int_value);
printf("%c\n", m.char_value);
}
非常感谢您可以耐心读到这里,博客内容写的很粗糙,只是分享自己在学习中的一些想法,有错误指正和改进欢迎提出!