C语言 自定义类型

news2024/11/15 15:32:46

结构体内存对齐

在这里插入图片描述
解释1 从内存开始位置存放
在这里插入图片描述
解释二 int对齐数是4 vs默认对齐数是8 取其较小值的倍数 那就是4的位置存放
char 对数1 vs是8默认 谁的较小值对数是1 那就是任意数 所以c2防砸8 如下图绿色部分
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

struct S2
{
	char c1;
	int i;
	double d;//8
};

输出结果16


struct S4
{
	double d;
	char c;
	int i;
};

在这里插入图片描述


struct S4
{
	double d;
	char c;
	int i;
};
struct S5
{
	char c1;
	struct S4 s4;
	double d;
};
	printf("%d\n", sizeof(s5));//32

如果发生嵌套 偏移量取最大对齐数 比如s4最大时double8,把算出的16填入从8开始。最终的对齐数取两个的最大对齐数
在这里插入图片描述

设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到

让空间小的成员尽量集中在一起

修改默认对齐数

默认对齐数是8

把默认对齐数改为2
#pragma pack(2)
struct S
{
	char c1;//0
	1-3 浪费
	int i;//4-7
	char c2;//8
	9-11 浪费
};
#pragma pack()//这里是取消掉



#pragma pack(1)
struct S
{
	char c1;//1 1 1
	int i;//4 1 1
	char c2;//1 1 1
};
#pragma pack()   //结果6
int main()
{
	printf("%d\n", sizeof(struct S));//

	return 0;
}

offsetof

#include <stddef.h>

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

int main()
{
	printf("%d\n", offsetof(struct S, c1));//c1相对于这个结构体成员的偏移量.相当于起始位置
	printf("%d\n", offsetof(struct S, i));
	printf("%d\n", offsetof(struct S, c2));

	return 0;
}

结构体传参

在这里插入图片描述
结构体传参 传递地址更好

结构体实现位段

位段成员必须是int ,unsigned int或signed int 还能见到char类型
在这里插入图片描述
A是一个位段类型 那位段A的大小是多少

一个整形32个bit位
struct A
{
	//4个字节 - 32bit    根据位段的内存分配  int开辟一个整形来分配以下空间  如果不够就在开辟
	int _a : 2;//_a 成员占2个bit位
	int _b : 5;//_b 成员占5个bit位
	int _c : 10;//_c 成员占10个bit位
	//15
	//4个字节 - 32bit    这里只剩15个放不下30个所以有开辟了一个   随意开辟两个整形总共8个字节
	int _d : 30;//_b 成员占30个bit位
};
16- int - 2byte - 16 bit
32- int - 4byte - 32 bit

int main()
{
	printf("%d\n", sizeof(struct A));//8

	return 0;
}

在这里插入图片描述

struct S
{
	char a : 3;
	char b : 4;
	char c : 5;
	char d : 4;
};

int main()
{
	struct S s = { 0 };
	s.a = 10;
	s.b = 12;
	s.c = 3;
	s.d = 4;

	return 0;
}//结果为 62  03  04

由以上的出 一个字节内部数据在使用的时候先使用低地址 在使用高地址 从右向左。当一块空间有剩余不够使用的时候直接浪费掉就行
在这里插入图片描述
在这里插入图片描述

位段的应用

节省空间
在这里插入图片描述

枚举 (一一列举的意思)

在这里插入图片描述

#define RED 5
#define GREEN 8
#define BLUE 9

//声明枚举类型
enum Color
{
	RED=5,//5   默认递增1   可给赋初值
	GREEN=8,//8
	BLUE//9
};//可能取值放在枚举类型  常量

int main()
{
	//CPP 语法检查更加严格
	enum Color c = BLUE;//颜色的可能取值赋给c
	printf("%d\n", sizeof(c));

	/*printf("%d\n", RED);  0
	printf("%d\n", GREEN);1
	printf("%d\n", BLUE);  2*/
	printf("%d\n", Color::RED);  //枚举类型大小就是个整形变量  打印4
	return 0;
}

枚举引用


void menu()
{
	printf("*****************************\n");
	printf("****  1. add    2. sub  *****\n");
	printf("****  3. mul    4. div  *****\n");
	printf("****  0. exit          *****\n");
	printf("*****************************\n");
}

enum Option
{
	EXIT,//0
	ADD,//1
	SUB,//2
	MUL,//3
	DIV//4
};

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			break;
		case SUB:
			break;
		case MUL:
			break;
		case DIV:
			break;
		case EXIT:
			break;
		default:
			break;
		}
	} while (input);


	return 0;
}

枚举优点

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/130893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

当我们身边没有示波器就无法测量频率与占空比了?一招教你解决身边没有示波器时如何测量STM32定时器产生PWM的频率与占空比

当我们身边没有示波器就无法测量频率与占空比了&#xff1f;这篇文件小编就教大家如何使用定时器输入捕获功能测量频率与占空比。 原理解析 定时器输入捕获一般应用在两个方面&#xff0c;一个方面是脉冲跳变沿时间测量&#xff0c;另一方面是 PWM输入测量。下面将要使用就是测…

LaTeX快速入门

文章目录LaTeX快速入门一、 概述1、 简介2、 环境配置3、文件结构4、 文档结构二、 基本概念1、 第一个LaTeX程序2、 宏包和文档类2.1 宏包2.2 文档类3、 文件组织的方式4、 相关术语和概念三、 排版文字1、 文字编码2、 排版中文3、 LaTeX中的字符3.1 空格和分行3.2 注释3.3 特…

Redis(Ⅰ)【学习笔记】

&#xff08;仅作为个人学习笔记&#xff09; 1.什么是Redis&#xff1f; 1.Redis 是用C语言开发的一个开源的高性能键值对&#xff08; key-value &#xff09;内存数据库&#xff0c;它是一种 NoSQL 数据库。 2.它是【单进程单线程】的内存数据库&#xff0c;所以说不存在线…

charAt()方法的使用

charAt()函数 Java charAt() 方法属于Java String类 charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。 语法 public char charAt(int index) 参数 index – 字符的索引。 返回值 返回指定索引处的字符。 举个例子&#xff1a; package 做题;…

基于思维进化算法优化BP神经网络(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

Kubernetes之PV与PVC

1. 综述 当前&#xff0c;存储的方式和种类有很多&#xff0c;并且各种存储的参数也需要非常专业的技术人员才能够了解。在Kubernetes集群中&#xff0c;放了方便我们的使用和管理&#xff0c;Kubernetes提出了PV和PVC的概念&#xff0c;这样Kubernetes集群的管理人员就可以将注…

linux系统中利用设备树完成对LED的控制

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用linux系统中的设备树控制led。 目录 第一&#xff1a;设备树LED基本驱动原理 第二&#xff1a;LED灯驱动程序的实现 第一&#xff1a;设备树LED基本驱动原理 本次实验采用设备树向linux内核传递相关的寄存器物理…

MATLAB演示梯度上升寻找极值

MATLAB演示梯度上升寻找极值 梯度 梯度的本意是一个向量&#xff08;矢量&#xff09;&#xff0c;表示某一函数在该点处的方向导数沿着该方向取得最大值&#xff0c;即函数在该点处沿着该方向&#xff08;此梯度的方向&#xff09;变化最快&#xff0c;变化率最大&#xff08…

dubbo源码解析-SPI机制

SPI&#xff0c;Service Provider Interface&#xff0c;服务提供者接口&#xff0c;是一种服务发现机制。 JDK 的 SPI 规范 JDK 的 SPI 规范规定&#xff1a;  接口名&#xff1a;可随意定义  实现类名&#xff1a;可随意定义  提供者配置文件路径&#xff1a;其查…

剑指offer(简单)

目录 数组中重复的数字 替换空格 从尾到头打印链表 用两个栈实现队列 斐波那契数列 青蛙跳台阶问题 旋转数组的最小数字 二进制中的1的个数 打印从1到最大的n位数 删除链表的节点 调整数组顺序使奇数位于偶数前面 链表中倒数第k个节点 反转链表 合并两个排序的链…

一文读懂tensorflow: 基本概念和API

文章目录前言tensorflow发展历程基本概念张量神经网络、层模型超参数损失函数交叉熵函数激活函数梯度和自动微分优化器tensorflow 2.x 和 tensorflow 1.xtensorflow开发流程tensorflow API张量的定义和运算示例张量的初始化方式梯度计算模型的搭建示例&#xff1a;MINST手写数字…

Casting out Primes: Bignum Arithmetic for Zero-Knowledge Proofs学习笔记

1. 引言 Polygon zero团队 Daniel Lubarov 和 Polygon zkEVM团队 Jordi Baylina 2022年10月联合发表的论文 《Casting out Primes: Bignum Arithmetic for Zero-Knowledge Proofs》。 受“casting out nines” 技术——做对9取模运算并提供概率性结果&#xff0c;启发&#x…

RocketMQ 的存储模型

文章目录1.整体概览2.数据文件3.消费文件4.索引文件1.整体概览 Producer &#xff1a;消息发布的角色&#xff0c;Producer 通过 MQ 的负载均衡模块选择相应的 Broker 集群队列进行消息投递&#xff0c;投递的过程支持快速失败并且低延迟。 Consumer &#xff1a;消息消费的角…

如何应用人工智能和机器学习来预测消费者的行为

应用AI和机器学习来预测消费者行为 在这篇文章中&#xff0c;我们将学习和分析一般的消费者行为。我们还将了解人工智能是如何帮助发现有价值的见解的&#xff0c;从而使公司做出正确的决定&#xff0c;以实现提供更好的价值和创造更好的收入的愿景。 我们还将通过一个案例进…

6.2 参数传递

文章目录传值参数指针形参传引用参数使用引用避免拷贝使用引用形参返回额外信息const形参和实参指针或引用形参与const尽量使用常量引用数组形参使用标记指定数组长度使用标准库规范显式传递一个数组的长度数组形参和const数组引用形参传递多维数组main&#xff1a;处理命令行选…

142.环形链表II

给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数…

java开发社区活动预约系统

简介 本系统主要是社区活动预约系统网站&#xff0c;社区管理员可以发布活动&#xff0c;社区居民和游客均可进行活动预约&#xff0c;管理员后台审核预约是否通过&#xff0c;居民可以填写活动感受&#xff0c;管理员查看感受后可以进行反馈。居民最多取消三次预约&#xff0…

我用Python做了个动图生成器,把一千个MM生成了GIF设置桌面,只为每天愉悦心情

文章目录序言代码实战序言 现在的年轻人都开始每天保温杯里泡枸杞&#xff0c;这怎么能行呢&#xff1f; 想要每天过的好&#xff0c;美女必然少不了&#xff0c;每天看美女&#xff0c;只为了愉悦心情&#xff0c;心情好了&#xff0c;才长寿。 于是怀揣着愉悦心情的想法&am…

【leetcode】剑指offer1

&#x1f308;1.Pow(x,n) -100.0 < x < 100.0-2^31 < n < 2^31-1n 是一个整数-10^4 < x^n < 10^4思路分析&#xff1a; 暴力求解直接一个for循环n个x相乘解决&#xff0c;但是你拿那代码怎么好意思拿高薪&#xff1f; 所以而且那个的时间复杂度是O(n),效率并…

[阿里云] 10分钟带你玩转阿里云ECS和云盘 (大数据上云必备)

前言 由于准备做一些离线计算和实时计算的模拟, 发现某些教程内的阿里云还挺好用的, 在这里把相关的经验分享给大家. 简单的心路历程: 起先笔者搭建了一套本地集群. 但是后来发现, 因为没用网络IP的反穿, 本地的集群的网络访问非常不便. 其次, 集群的启停, 网络和磁盘管理都非…