结构体,枚举,联合

本文详细探讨了C/C++中的结构体基础、声明与初始化,位段的定义与应用,枚举类型的优势,以及联合的定义和内存特性。通过实例讲解内存对齐和offsetof函数的使用。涵盖了结构体、位段、枚举和联合的实用技巧。
摘要由CSDN通过智能技术生成

目录

1.结构体

1.1结构体的基础知识

1.2 结构的声明

1.3:结构体的声明

1.4:结构的自引用

 1.5 结构体变量的初始化

1.6:结构体的内存对齐

1.7:offsetof函数

1.7.1:offsetof函数的用例

2.位段

2.1:位端的定义

3.枚举

3.1:枚举类型的定义

3.2:枚举的优点

4.联合

4.1:联合的定义

4.2:联合的特点

4.3:联合大小的计算


1.结构体

1.1结构体的基础知识

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

1.2 结构的声明

一般形式:

               struct   结构体名

                         {成员变量};

接下来,我们创建一个学生的结构体

记得要有分号。

1.3:结构体的声明

struct student
{
    char name[10];//名字
    char sex[5];//性别
    int age;//年龄
    int number//学号
}p1,p2;//声明p1,p2 学生-----第一种方法声明
int main()
{
    struct student s1;//第二种方法声明,
}

1.4:结构的自引用

 1.5 结构体变量的初始化

struct student
{
	char name[15];//名字
	char sex[10];//姓名
	int age;//年龄
	char add[20];//地址
}s1 = { "zhangsan","nan",20,"xian" };//第一种方法初始化
int main()
{
	struct student s1 = { "wangming","nu",18,"henan" };//第二种方法初始化
}

1.6:结构体的内存对齐

这是一个热门考点:结构体内存对齐:

如何计算?

首先得掌握结构体的对齐规则:

1,第一个成员在与结构体变量偏移量为0的地址处。

2,其他成员要对齐到莫个数字对齐数编译器默认的一个对齐数与该成员大小的较小值的整数倍的地址处。

3,结构体总大小为最大对齐数的整数倍。

既然知道规则了,那我们来试一试一道题,看看自己算对了没。

 这道题你们算对了吗?这道题可以检测出来,自己算对了吗,那就是offsetof 函数。

1.7:offsetof函数

offsetof这个函数的头文件#include<stddf.h>

(type,member)这个是结构体的成员属性。

1.7.1:offsetof函数的用例

struct s3
{
	double d;
	char c;
	int i;
};
int main()
{
	printf("%d\n", sizeof(struct s3));
	printf("%d\n", (int)offsetof(struct s3,d));
	printf("%d\n", (int)offsetof(struct s3, c));
	printf("%d\n", (int)offsetof(struct s3, i));

	return 0;
}

2.位段

2.1:位端的定义

注意:

1.位端成员必须是int ,unsigned, int 或signed int.

2.位端的成员名后边有一个冒号和一个数字。

2.2:位端的用例

位端的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟。 

位端是不跨平台的。


3.枚举

3.1:枚举类型的定义

从这里看:默认从零开始,依次递增1, 

3.2:枚举的优点

1.增加代码的可读性和可维护性

2.防止命名污染。

3.使用方便,一次可以定义多个变量。

4.便于调试。


4.联合

4.1:联合的定义

这些成员公用同一块空间

4.2:联合的特点

联合的成员是共用同一块内存空间,这样一个联合变量的大小,至少是最大成员的大小。

4.3:联合大小的计算

1.联合大小至少是最大成员的大小。

2.当最大成员的大小不是最大对齐数的倍数的时候,就要对齐到最大对齐数的整数倍。

 

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值