结构体、枚举、联合等自定义类型介绍

本文深入探讨了C语言中的高级数据类型,包括结构体、枚举和联合体的概念及应用。介绍了结构体的声明、成员访问、内存对齐规则等内容,并详细解释了枚举类型与联合体的特点。

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

一:要想了解这些数据类型,首先我们得知道在c语言中都有哪些数据类型,以及为什么要有数据类型。
1.类型的意义:决定使用这种类型所要开辟内存空间的大小;如何看待这块内存空间。
2.c语言中都有哪些数据类型,如图:这里写图片描述
这里我们主要讲结构体、枚举、联合体等自定义数据类型
二:结构体
1.概念:将相同或不同属性的类型数据放在一起。
2.结构体声明:
struct A//(A是结构体标签,不建议省略)
{
    member-list//成员列表,c语言中不能省略
}variable-list//结构体变量成员列表,可省略
3.结构体成员的访问:因为结构体中有不同类型的数据,所以不能像数组那样,用下标来访问。结构体有两种方式来访问成员。
struct B
{
    char name[20];
    int age;
};
(1).struct B s;定义结构体变量名,用名称+.的方式访问。例:s.name, s.age。
(2).struct B *p;定义结构体指针,用指针+->的方式访问。例:p->name, p->age。
4.结构体变量的定义和初始化:
struct Point
{
    int x;
    int y;
}s;//声明类型的同时定义变量s

struct Point p1;//定义结构体变量
struct Point p2{2, 4};//初始化:定义变量的同时赋值
注意:结构体允许整体初始化,但不能整体赋值。
5.结构体内存对齐规则:
(1)结构体第一个成员的地址与结构体变量地址再数值上是相同的,偏移量就是成员地址与结构体变量地址的差值。如第一个成员的偏移量为0。
(2)结构体的所有成员都有对齐数(包含第一个成员),该成员的对齐数就是其自身类型大小和该平台对齐数中的较小值。(vs默认为8,Linux默认为4)
(3)成员对齐就是该成员的偏移量能够整除自身对齐数。
(4)结构体总大小为最大对齐数(各成员对齐数中的最大值)的整数倍。
(5)如果嵌套了结构体的情况,将它也看作普通成员,其对齐数为该结构体成员中的最大对齐数。
struct A
{
    char a;
    int b;
    double c;
};
在vs环境下struct A的大小为多少?a的对齐数为1,偏移量为0,它对齐。b的对齐数为4,偏移量为1,所以要空出3个字节它才能对齐,所以它和a占8个字节,c对齐数为8,偏移量为8,所以对齐,结构体大小为16,因为各成员中最大对齐数为c,8字节,能被16整除,所以struct A大小为16字节。
6.结构体传参:结构体传参时,由于性能问题,建议穿结构体的而地址。
三:枚举
1.概念:枚举就是把可能的取值一一列举。(枚举常量默认从整形0开始,一次递增1)
2.定义:
enum Day//定义的枚举类型
{
    Mon,//注意枚举常量用逗号分隔
    Tues,
    Wed
};
3.赋值:在定义的时候可赋初值
enum Day//定义的枚举类型
{
    Mon = 1,
    Tues = 3,
    Wed
};
四:联合
1.概念:这种类型定义的变量也包含一系列成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
2.声明:
union Un//声明的联合类型
{
    char c;
    int i;
}un;//可省略,如果没省略,就是在声明联合类型的同时定义了联合变量

//联合变量的定义
union Un un;
3.联合大小的计算:联合与结构体一样也要考虑内存对齐的情况,所以在计算是有以下几点
(1)联合的大小至少是最大成员的大小
(2)当最大成员不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值