当前位置: 首页 > news >正文

自定义类型:结构体(内存对齐),枚举,联合

文章目录

    • 结构体
      • 结构体的声明
        • 结构体的基础知识
        • 结构体的声明
        • 特殊的声明
        • 结构体的自引用
        • 结构体变量的定义和初始化
        • 结构体的内存对齐

本章重点

  • 结构体

结构体类型的声明

结构体的自引用

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

结构体内存对齐

结构体实现位段(位段的填充&可移植性)

  • 枚举

枚举类型的有点

枚举的优点

枚举的使用

  • 联合

联合类型的定义

联合的特点

联合大小的计算

结构体

结构体的声明

结构体的基础知识

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

结构体的声明

struct Book {
	char book_name[20];
	char author[20];
	int price;
	char id[20];
};

分号前面可以加结构体变量,是全局变量

特殊的声明

在声明结构的时候,可以不完全声明

struct {
	char book_name[20];
	char author[20];
	int price;
	char id[20];
}sb1, sb2;

这个在声明的时候省略了结构体的标签,也叫作匿名结构体类型只能使用一次

那么问题来了?

struct {
	char book_name[20];
	char author[20];
	int price;
	char id[20];
}sb1;


struct {
	char book_name[20];
	char author[20];
	int price;
	char id[20];
}* ps;


int main() {
	ps = &sb1;
	return 0;
}

**警告:**编译器会把上面的两个声明当成完全不相同的类型。所以是非法的

结构体的自引用

使用场景,就是链表当中

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

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

有了结构体那么如何定义变量,

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


struct Point {
	int x;
	int y;
}p1;	//声明类型的同时定义变量p1

struct Point p2;//定义结构体变量p2


//初始化:定义变量的同时赋值

struct Point p3 = { x, y };

结构体的内存对齐

struct S1 {
	char c1;
	int i;
	char c2;
};

struct S2 {
	char c1;
	char c2;
	int i;
};

#include <stdio.h> 

int main()  {
	printf("%d\n", sizeof(struct S1));
	printf("%d\n", sizeof(struct S2));
}

结果是什么?

image-20220917104233614

这是因为什么那?

就是结构体内存对齐,这里在介绍一个函数

offsetof,

offsetof (type,member),这个函数的功能就是计算结构体成员相对于起始位置的偏移量

image-20220917110204070

这是对应的偏移量,所以怎么画图那(这是根据偏移量计算的)

image-20220917110451177

如何计算?

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

  1. 第一个成员在与结构体变量偏移量为0的地址处
  2. 第二个成员开始,要对齐到某个【对齐数】的整数倍到的偏移处,对齐数:结构体成员自身大小和默认对齐数的较小值

VS: 8

Linux: 默认不设对齐数(对齐数是结构体成员的自身大小)

相关文章:

  • 【云原生之Docker实战】使用Docker部署Wizard文档管理系统
  • 图书管理系统的设计与实现/ssm的图书管理网站
  • 深度学习pytorch训练代码模板(个人习惯)
  • 盒模型(非要让我凑满五个字标题)
  • OPTEE:TA和TA加载(一)
  • 抽象之美——万物皆可设计
  • steam搬砖项目,2022年详细讲解具体操作流程
  • c语言进阶:指针的进阶(下)
  • 嵌入式开发之驱动测试实践
  • GAMES101 路径追踪
  • CCF- CSP 202009-2风险人群筛查 满分题解
  • 《Python3 网络爬虫开发实战》:什么是AJAX?
  • 超详细Python自动化测试学习指南,附学习路线图+企业真实项目。看完月薪30K指日可待。。。
  • 卷积神经网络基础
  • PCIe系列专题之二:2.1 TLP的前世今生
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • CentOS6 编译安装 redis-3.2.3
  • CSS 专业技巧
  • css选择器
  • Debian下无root权限使用Python访问Oracle
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript类型识别
  • php中curl和soap方式请求服务超时问题
  • Python连接Oracle
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Spring-boot 启动时碰到的错误
  • webgl (原生)基础入门指南【一】
  • 飞驰在Mesos的涡轮引擎上
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 经典排序算法及其 Java 实现
  • 配置 PM2 实现代码自动发布
  • 前端
  • 深入浏览器事件循环的本质
  • 详解NodeJs流之一
  • 异常机制详解
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 积累各种好的链接
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​低代码平台的核心价值与优势
  • #Ubuntu(修改root信息)
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (27)4.8 习题课
  • (4) PIVOT 和 UPIVOT 的使用
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (四)库存超卖案例实战——优化redis分布式锁
  • (图)IntelliTrace Tools 跟踪云端程序
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net 发送邮件
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • @private @protected @public