IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C语言】用例子一次性讲清楚结构体和联合体区别,xdm看过来! -> 正文阅读

[C++知识库]【C语言】用例子一次性讲清楚结构体和联合体区别,xdm看过来!

一、结构体

1. 结构体声明

正常声明,特殊声明以及自引用

普通的声明方式一般为:

struct Car{
	char carBrand[20];
	int carEngineVolume;
	int year;
	char manufacturingCountry[20];
};

匿名声明方式:

struct {
	char carBrand[20];
	int carEngineVolume;
	int year;
	char manufacturingCountry[20];
}*Car;

结构自引用:

如链表的定义

typedef struct Node{
	int num;
	struct Node* next;
}Node;

2. 结构体初始化

以车为例子

struct Car volks = {"Volkswagen", 8, 2, "Germany"};

3. 结构体内存对齐

重点来了!!!
c语言中的结构体内存是如何对齐的呢?

根据一下几个原则:

  1. 第一个成员在与结构体变量偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

(对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值)

  1. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
  2. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所
    有最大对齐数(含嵌套结构体的对齐数)的整数倍。

??注意:对齐数默认值在不同编译器下不相同,我们可以在文件的开头用#pragma pack(4)进行声明对齐数

内存对齐实际上能解决两个问题:

  1. 平台移植问题,不是所有硬件平台都能访问任意地址的任意数据
  2. 性能问题,如果不对齐,处理器可能需要两次访问内存而对齐后仅需要一次,以空间换时间

下面的结构体大小为12

struct S{
	int a; // 0 1 2 3 
	short b; //4 5 
	char c; // 6
	int d; // 7 浪费,8 9 10 11 
};

根据上面的规则进行运算:

  1. 首先第一个成员从偏移量0开始,占4个字节也就是 0,1,2,3
  2. 然后偏移量到4,判断short自身大小为2,对齐数是4,最小对齐数是2,偏移量4正好是2的整数倍,因此占两个字节4,5
  3. char占一个字节,偏移量目前为6,6是1的倍数,这里占1个字节 6
  4. 下一个int自身大小为4,对齐数为4,选择4,偏移量7不是4的整数倍因此偏移量浪费7,偏移量到8的时候对齐,占8,9,10,11
  5. 最后又规定结构体总大小为最大最齐数的整数倍,结构体总大小为12, 最大对齐数为4条件成立,因此结构体大小为12

3. 结构体位段

??注意:位段和结构体类似,但位段的声明成员必须是int或 signed int,还有成员后面有一个冒号:和一个数字,也就是多少比特

举个例子

struct A{

    int __a__: 2;
    int __b__: 7;
    int __c__: 1;
    int __d__: 8;
    int __e__: 5;
};

int main(){

    struct A size = {0};
    size.__a__ = 5;
    size.__b__ = 4;
    size.__c__ = 10;
    size.__d__ = 12;
    size.__e__ = 8;

    //1 4 0 c 8
    printf("%2x %2x %2x %2x %2x  ", size.__a__, size.__b__, size.__c__, size.__d__, size.__e__);
    return 0;
}

二、联合体(共同体)

联合是一种特殊的自定义类型,和结构体不同的是这些成员共用一块空间,联合的大小至少是最大成员的大小,当最大成员大小不是最大对齐数的整数倍的时候,就需要对齐到最大对齐数的整数倍

union Un
{
	short s[7];
	int n;
};

这里的short本身大小为2,数组共14,int自身大小为4,所以这里的最大对齐数是14,又因为要最大成员int对齐到最大对齐数的整数倍那么就需要对齐到16,所以这里联合体大小为16

三、枚举

枚举就是列举,默认从0开始,依次增加

enum color{

	R, // 0
	G, // 1
	B, // 2
	Y= 255, // 255
	P  // 256
};

枚举的优点:
可以增加代码的可读性和维护性,尤其在case中
便于携带调试和使用方便,一次可以定义多个常量

创作不易,如果文章对你有帮助的话,留言、点赞、收藏牙牙:)

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 11:27:16  更:2021-07-29 11:28:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/28 2:26:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码