C语言自定义类型详解(结构体 + 枚举 + 共用体)

目录

一:结构体

1.结构体的声明

1.1 常见的结构体声明方式

1.2 特殊的声明

1.3 结构的自引用

 1.4 结构体变量的定义和初始化

 1.5 结构体内存对齐

1.6 修改默认对齐数

​1.7  结构体传参

 2. 位段

 二:枚举

1.1 枚举类型的定义

1.2 枚举的优点

1.3 枚举的使用

三:联合(共用体) 

1.1 联合类型的定义

 1.2 联合的特点

1.3 联合大小的计算


以下自定义类型,均需要先声明后使用

一:结构体

1.结构体的声明

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

1.1 常见的结构体声明方式

struct tag(struct是结构体的关键字,tag是可自定义的标签名

{

         member-list;//成员变量,根据具体的描述对象添加不同类型的变量

}variable-list;//variable-list是用此结构体类型创建的变量,属于全局变量,也可以不创建

例如描述一个学生:

struct Stu(struct是结构体的关键字,Stu是自定义的标签名

{

        char name[20];//名字

        int age;//年龄

        char sex[5];//性别

        char id[20];//学号

};//分号

1.2 特殊的声明

省略结构体的标签名(匿名结构体类型)

比如:

1.3 结构的自引用

注意:必须使用指针

 还有:注意typedef的是使用

 1.4 结构体变量的定义和初始化

 1.5 结构体内存对齐

首先,介绍一个宏:offsetof(type,member);   头文件<stddef.h>

type : 数据的类型

member: 数据的成员变量

功能:

返回成员偏移量

此具有函数形式的宏返回数据结构或联合类型类型中成员相对于起始位置的偏移值(以字节为单位)。

返回的值是类型为 size_t 的无符号整数值。

相对于起始位置的偏移值是什么?(如下图)

举个例子如下:

 为什么会出现上述结果?

 这是因为结构体的数据在存储时要满足内存对齐,那具体的规则是怎样呢,别急,我们接着往下看。

 为什么存在内存对齐

1.6 修改默认对齐数

 1.7  结构体传参

 2. 位段

认识位段的基本结构:

实例测试:

需要特别注意的地方: 


 二:枚举

枚举顾名思义就是一 一列举。

把可能的取值一 一列举。

比如我们现实生活中:

                        一周的星期一到星期日是有限的7天,可以一 一列举。

                        性别有:男、女、保密,也可以一 一列举。

                        月份有12个月,也可以一 一列举

1.1 枚举类型的定义

书写示例:

 以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。

{}中的内容是枚举类型的可能取值,也叫 枚举常量

这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。 

比如:

enum Color//颜色

{

         RED=1,

        GREEN=2,

        BLUE=4

};

1.2 枚举的优点

我们可以使用 #define 定义常量,为什么非要使用枚举?

枚举的优点:

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

2. 使用方便,一次可以定义多个常量

3. 便于调试

从上图不难看出,左边的写法更加直观一些。 

#define也可以定义多个常量,但是一次只能定义一个,如果要和上图示左边达到同样的效果,那么就要写成:

#define Exit 0
#define Add 1
#define Sub 2
#define Mul 3
#define Div 4

虽然这样要繁琐一些

当然,合不合适,繁琐还是简易都不能一概而论,要根据具体场景的具体需要来确定,一般来说:枚举是用在有限个 已知的可能的取值可以一 一列举,且这些可能的取值一般都归为同一类描述同一个对象的时候,就像星期一到星期日描述的就是一周内有限的7个可能的取值,一月到十二月描述的就是一年内有限的12个可能的取值,等等,这些时候,用枚举就比较简便合适。

4. 和#define定义的标识符比较枚举有类型检查,更加严谨

 而#define即使在C++下,也不会有任何的类型检查。

1.3 枚举的使用

三:联合(共用体) 

1.1 联合类型的定义

联合也是一种特殊的自定义类型

这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。

比如:

//联合类型的声明
union Un
{
    char c;
    int i;
};
//联合变量的定义
union Un un;

int main()
{
    //初始化
    un.c = 'a';
    un.i = 10;
    return 0;
}

 1.2 联合的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联 合至少得有能力保存最大的那个成员)。

列举一个应用:

判断当前机器的大小端存储类型:

1.3 联合大小的计算

  好了,到这就结束了,如果我的分享对你有帮助的话,点赞关注加收藏或者把它分享给你的好友一起学习吧。

 关注我,持续更新哟! 

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
C语言结构体是一种自定义数据类型,可以将不同类型的变量组合在一起,形成一个新的数据类型结构体定义的基本形式如下: ```c struct 结构体名 { 数据类型 成员名1; 数据类型 成员名2; // ... }; ``` 其结构体名是用户自定义的名称,成员名是结构体每个成员的名称,数据类型可以是任意C语言的数据类型,包括基本数据类型自定义数据类型结构体变量的定义方式如下: ```c struct 结构体名 变量名; ``` 读取结构体的成员变量可以通过“.”运算符来实现,例如: ```c #include <stdio.h> struct Person { char name[20]; int age; }; int main() { struct Person p; printf("请输入姓名:"); scanf("%s", p.name); printf("请输入年龄:"); scanf("%d", &p.age); printf("姓名:%s,年龄:%d\n", p.name, p.age); return 0; } ``` 枚举是一种特殊的数据类型,用于定义一组常量。枚举的定义方式如下: ```c enum 枚举名 { 常量名1, 常量名2, // ... }; ``` 其枚举名是用户自定义的名称,常量名是枚举每个常量的名称。枚举常量的值默认是从0开始自动递增的,也可以手动指定值。例如: ```c #include <stdio.h> enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; int main() { enum Weekday today = Tuesday; printf("今天是星期%d\n", today + 1); return 0; } ``` 联合是一种特殊的数据类型,它的成员变量共享同一块内存空间。联合的定义方式如下: ```c union 联合名 { 数据类型 成员名1; 数据类型 成员名2; // ... }; ``` 其,联合名是用户自定义的名称,成员名是联合每个成员的名称,数据类型可以是任意C语言的数据类型,但所有成员的大小不能超过联合的大小。例如: ```c #include <stdio.h> union Number { int i; float f; }; int main() { union Number n; n.i = 123; printf("int: %d, float: %.2f\n", n.i, n.f); n.f = 3.14; printf("int: %d, float: %.2f\n", n.i, n.f); return 0; } ``` 以上就是C语言自定义数据类型结构体枚举、联合的基本用法和注意事项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一般清意味……

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值