012+limou+C语言深入知识——(4)“结构体”与“枚举体”与“联合体”
创始人
2025-05-30 21:40:52
0

一、结构体

1、结构体基础

(1)结构体完全声明

struct tag
{member-list;
}variable-list;
//描述一个人
struct people
{char name[10];//人名int age;//年龄int idnumber;//身份证
};

(2)结构体不完全声明(匿名结构体)

struct
{member-list;
}variable-list;
  • 值得注意的是一个匿名结构体就是一个单独的类型,不同地方定义的匿名结构体的类型在编译期看来是两种类型,会给出警告

在这里插入图片描述

2、结构体自引用

有时候需要通过结构体变量内部成员找到同类型的结构体变量,这就叫结构体的自引用

(1)错误引用

struct Node
{int data;struct Node next;
};

(2)正确引用

struct Node
{int data;struct Node* next;
};

(3)使用typedef引用

typedef struct Node
{int data;struct Node* next;//注意不能写成Node* next
}Node;
  • 注意不要写成Node*,因为在typedef{…}Node;后才会将结构体改名为Node,在此之前Node这种类型是不存在的

3、结构体变量的初始化

  • 使用{}初始化
//描述一个人
typedef struct people
{char name[10];//人名int age;//年龄int idnumber;//身份证
}people;int main()
{people a = { "limou3434", 30, 44443333 };printf("%s %d %d", a.name, a.age, a.idnumber);return 0;
}
  • 另外结构体有初始化器
//描述一个人
typedef struct people
{char name[10];//人名int age;//年龄int idnumber;//身份证
}people;int main()
{people a = { "limou3434", 30, 44443333 };printf("%s %d %d\n", a.name, a.age, a.idnumber);people b = { .age = 20, .idnumber = 1234567890, .name = "limou" };printf("%s %d %d\n", b.name, b.age, b.idnumber);return 0;
}

4、结构体内存大小

(1)内存对齐计算规则

(2)VS默认对齐数

(3)修改默认对齐数

详细看另外一篇文章额外:结构体内存对齐

(4)偏移量计算宏

#include 
#include //使用offsetof宏,要包含头文件stddef.h
typedef struct people
{char name[10];//人名int age;//年龄int idnumber;//身份证
}people;
int main()
{people s = { "limou", 12, 88888888 };printf("%zd %zd %zd", offsetof(people, name), offsetof(people, age), offsetof(people, idnumber));
}

(5)节省结构体空间

将小的类型集中在一起就会一定程度节省结构体的空间

5、结构体位段

(1)位段基础位段的声明和结构是类似的,有两个不同:

①位段的成员必须是“整型算术类型”:int、unsigned int、signed int、char等
②位段的成员名后边有一个冒号和一个数字

//位段例子,后面的数字代表存储的比特位
struct A
{int a:2;int b:5;int c:10;int d:30;
};

(2)位段内存分配

  • 位段的空间是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的,每次为每个成员分配比特位

(3)位段跨平台

  • 位段涉及很多不确定因素
    • ①C标准在未被利用的空间这里,并未规定如何处理
    • ②在一个字节中,由于成员都会使用这段空间,所以成员之间的存放先后顺序也是不确定的
    • ③成员分配最大位的数目是没有办法确定的
    • ④int位段是被当成无符号还是有符号也同样是不确定的
  • 因此位段是不跨平台的,注重可移植的程序应该避免使用位段

(4)位段应用

位段主要是用在网络数据传输上,这点涉及较远,暂且不谈

二、枚举体

1、枚举体基础

enum 枚举名
{枚举成员1,枚举成员2,…枚举成员n
}

2、枚举体特点

枚举成员的值,从0开始一次递增1。也可以直接在枚举体内进行赋值,赋值成员后的成员,比赋值成员的值大1

3、枚举体使用

//一个枚举体的例子
#include 
enum Color//颜色
{RED,YELLOW,GREEN=6,BLUE
};
int main()
{enum Color c = BLUE;//注意最好不要直接赋7,这在C语言可能被允许,但是在C++上可能会提示类型错误,因为1是int类型,而enum Color是一种枚举体类型printf("%d\n", c);printf("%d %d %d %d\n", RED, YELLOW, GREEN, BLUE);
}

4、枚举的优点

①有类型检查
②比宏更加便于调试
③使用方便,一次定义多个常量
④代码可读性提高

相关内容

热门资讯

新年贺词祝福语 【实用】新年贺词祝福语(精选210句)  在平平淡淡的学习、工作、生活中,大家都尝试过写贺词吧,贺词...
优美的情人节祝福语短信摘录 2020年精选优美的情人节祝福语短信摘录23条  穿黑衣,带黑帽,单身贵族好热闹。黑皮鞋,黑夹袄,黑...
宝宝满月贺词 宝宝满月贺词  在日常生活或是工作学习中,大家都经常接触到贺词吧,贺词是在喜庆的仪式上所说的对人对事...
送给朋友的感恩节祝福语短信 2020年送给朋友的感恩节祝福语短信大汇总56条  友情是一盏明灯,照亮了我人生的黑暗;友情是一句问...
Elastic之elastic... 一、Elastic介绍 Elastic有一条完整的产品线及解决方案:Elastics...
十七、网上商城项目(1) 本章概要 脚手架项目搭建安装与配置 axios首页 页面头部组件 头部搜索框组件头部购物车组件头部组...
JavaScript【链表】 一、单向链表 1.链表和数组的缺点 2.链表的优势 3.单向链表简介 链表和数组一样࿰...
50岁生日祝福语 五十岁生日... 50岁生日祝福语 五十岁生日贺词人生感叹,10岁时,无忧无虑,天真无邪,20岁时,忙碌奔波,辛苦工作...
<Linux开发> linux... <Linux开发> linux开发工具-之-CMake简单例程[再见] Cmake相关文章如下: 1...
国庆节简单祝福语 2022年国庆节简单祝福语(精选155句)  在现实生活或工作学习中,大家都不可避免地会接触到祝福语...
母亲节丈母娘祝福语 母亲节丈母娘祝福语(精选175句)  在学习、工作或生活中,许多人都有过写祝福语的经历,对祝福语都不...
同事离职祝福语 同事离职祝福语15篇  在平平淡淡的学习、工作、生活中,大家都用到过祝福语吧,祝福语是指对人们的美好...
JAVASE(3.18) 目录 ​编辑 1.抽象类和抽象方法 2.接口 3.比较自定义类型 学习不要眼高手低,...
教师节优美祝福语短信 教师节优美祝福语短信55条  因为有了您,世界才会如此美丽,因为有了您,我的生命才会如此多彩!医生治...
去除Spire.Doc导出字样... //去除Spire.Doc导出字样信息try (FileInputStream in = n...
给老师的春节贺卡祝福语 给老师的春节贺卡祝福语170句  在我们平凡的日常里,要用到祝福语的情况还是蛮多的,祝福语可以起到增...
父亲节暖心祝福语 父亲节暖心祝福语  在日复一日的学习、工作或生活中,大家都用到过祝福语吧,祝福语有助于促进交流,拉近...
温馨教师节祝福语 2020年温馨教师节祝福语集锦45条  您辛劳了,教师节到了,您也该歇一歇了,坐着接接电话看看短信吧...
《RabbitMQ高阶知识》—... 《RabbitMQ高阶知识》— 消息可靠性 文章目录《RabbitMQ高阶知识》— 消息可靠性&#x...
Kubernetes(5):P... 我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程: pod创建...