C-结构体、位段、枚举、联合

一、结构体

1. 结构体的声明

例如,描述一个学生的信息:

// 第一种
typedef struct Student
{
	char name[20]; // 学生姓名
	int age;       // 学生年龄
	char sex[10];  // 学生性别
}Stu;// 新的类型名

Stu stu1;// 结构体变量
---------------------------------------
// 第二种
struct Stu
{
	char name[20]; // 学生姓名
	int age;       // 学生年龄
	char sex[10];  // 学生性别
}stu1;// 结构体变量
struct Stu stu2;// 构体变量

 
2. 结构体的初始化

(1)在定义结构体变量的同时,进行初始化:

struct Stu stu2 = { "liyong",21,"male" };

(2)在定义结构体变量后,逐个进行初始化:

stu1.name[20] = "liyong";
stu1.age = 21;
stu1.sex[10] = "male";

 
3. 结构体内存对齐
 
详见我的另一篇博客,链接:https://blog.csdn.net/qq_42195954/article/details/90116940
 

二、位段

注意:
位段的成员约束:必须是 int、 unsigned int、 signed int 、 char 类型
位段不跨平台,不可移植。

1. 位段的声明

	struct OBJ
	{
		char a : 3;
		char b : 4;
		char c : 5;
		char d : 4;
	};
	struct OBJ obj = { 0 };

2.位段的初始化

    obj.a = 10;
	obj.b = 12;
	obj.c = 3;
	obj.d = 4;

3.位段的内存分配

在位段的声明中,变量a,b,c,d冒号后面的数字表示:取该类型的几位

因此,我们用画图的方式理解:
在这里插入图片描述
由上图可以得出,位段OBJ大小是三个字节。

还有几个例子以便更好理解:
在这里插入图片描述

 

三、枚举

枚举类型和结构体类型的比较:
在这里插入图片描述
枚举的取值:枚举类型默认从0开始,一次递增1。
在定义的时候也可以赋初值,类似结构体。
枚举类型的成员是常量,赋初值时前加const。
 

四、联合

 

4.1 联合的声明:
	union OBJ
	{
		int a;
		char b;
	};
	union OBJ obj;

首先,联合的成员共用一个最大成员的存储空间,此处 int a; 是最大的成员。

obj的大小:

1.先看最大成员变量的大小
2.考虑对齐数
最终的大小是 最大成员变量大小 加上 某一个较小整数 得出的结果是 对齐数的整数倍 。

上面的声明中,最大成员变量大小是4个字节,最大对齐数是4,4+0=4,最大成员大小是对齐数的整数倍,所以大小是4个字节。
 

4.2 联合变量的大小:

我们举一个例子:

union Un
{
    char c;
    int i;
};

int main()
{
    union Un un = { 0 };
    un.c = 129;
    printf("%d\n", un.c);
    printf("%d\n", un.i);
    system("pause");
    return 0;
}

仔细想一想,这个程序输出多少?

我们先来做个分析:
在这里插入图片描述
上述给了三个例子说明问题,在联合变量存储中,必须了解先类型提升。
类型提升:https://blog.csdn.net/qq_42195954/article/details/89311467

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值