day 28 结构体 共用体 枚举 位段

本文介绍了C语言中结构体的内存对齐特性,共用体的存储方式以及如何利用共用体判断设备的大小端序,枚举用于提升代码可读性,以及位段如何节省存储空间。通过实例展示了这些概念的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.结构体的大小:由于编译器以空间换取时间,所以结构体内的成员的大小并不是我们以为的它们本来的大小,它会有对齐的特性,编译器会按照结构体成员数据类型最大者来分配空间。示例如下:

#include<stdio.h>
#include<string.h>

#pragma pack(8) 
typedef struct stu{
	char name[24];
	short int num;
	int s;
}Stu;

int main(){
	Stu m;
	printf("%d\n",sizeof(m));
	printf("%p\n",&m.num);
	printf("%p\n",&m.name);
	printf("%p\n",&m.s);
	return 0;
}

结果如下:

 #pragma pack(8)这个语句是强制它以8个字节为单位进行空间分配。如果没有这句,那么它会根据顺序以大的数据类型大小来分配。

2.共用体:

 共用体是一种构造的数据类型,它能在同一个内存空间中存储不同的数据类型,他的典型用法是,设计一种表以储存既无规律、事先也不知道顺序的混合类型。

他们公用一个内存空间,这个空间是最大的数据类型的空间,例如联合体内有char int double 那么内存空间分配的就是8个字节。

具体的定义及引用与结构体差距不大,示例如下:

union data{
    int i;
    char j;
    fouble z;
};

这样就定义了一个三个成员的共用体,大小为8个字节。它与结构体不同的是,它只会显示最后存进去的成员的值,可以理解为一个家庭只有一辆车,所以每当有人使用车时,其他的人只能等着。

根据这个特性我们可以测设备时大端序还是小端序,代码如下:

typedef union stu{
	int a;
	char b;
}STU;

int main(){
	STU m;
	m.a=0x12345678;
	if(m.b==0x12){
		printf("这是带端序.\n");
	}else{
		printf("这是修端序.\n");
	}
	return 0;
}

结果如下:

可以得到我的设备是小端序的。原理就是,先用int型存进一个数据,根据共用体的特性 ,用char型输出,根据输出的内容,判断它在高地址位还是低地址位,进而判断大小端序。

3.枚举:枚举就是将一堆有意义的单词赋值,这样可以增加代码的可阅读性,和#define用法类似,适用于定义较多的情况。

它的定义与结构体很像,示例如下:

#include<stdio.h>
#include<string.h>
 
enum stu{
    mon,tue,wed,thu,fri,sat,sun,
};

 里面的第一个成员如果不赋值默认是0,然后依次加1,如果有赋值则以赋值为准。

4.位段:是一种更紧凑存储数据的方式,用来节省资源,示例如下:

#include<stdio.h>
#include<string.h>
 
typedef struct  reg{
	int a:2;
	int b:4;
	int c:6;
	int d:4;	
}REG;
 
int main(){
	REG registe;
	registe.a = 3;
	registe.b = 10;
	registe.c = 20;
	registe.d = 9;
	printf("%d, %d, %d, %d\n",registe.a, registe.b, registe.c, registe.d);
	printf("%d", sizeof(registe));
	
	return 0;	
} 

我们定义一个2位的a,4位的b,6位的c,4位的d,因为这些都是有符号的,这个a赋3换算二进制就是011取反加一位101,就是-1后面的以此类推会出现 -6, 20, 7,当然如果位数够就会输出本来的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值