C语言 之 结构体超详细总结

news2024/11/19 4:37:12

 🌈 个人主页:白子寰
🔥 分类专栏:魔法指针,进阶C++,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~
💡 坚持创作博文(平均质量分78.8+),分享更多关于深度学习、C/C++领域的优质内容!  (希望得到您的关注~)  

目录

结构体的创建

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

变量的定义

初始化

结构体嵌套结构体 

 结构体访问成员

方式一:使用 . 访问

方式二:用指针访问

 结构体与函数

结构体内存对齐

对齐规则

示例 

①段代码

②段代码 

 代码结果解释:​

代码结果解释

修改默认对齐数 


 

注:为保证讲解的逻辑性,以下👇代码按顺序逐步添加

结构体的创建

举个栗子:创建结构体学生,包含(学号,名字,性别,成绩)

struct student
{
	int id;       //学号
	char name[5]; //名字
	char sex[4];  //性别
	double scorce;//成绩
};

 

结构体创建👆解释 


 

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

变量的定义

struct student
{
	int id;       //学号
	char name[5]; //名字
	char sex[4];  //性别
	double scorce;//成绩
}p1;              //定义一:定义变量p1

struct student p2;//定义二:定义结构体变量p2

 

初始化

struct student
{
	int id;       //学号
	char name[5]; //名字
	char sex[4];  //性别
	double scorce;//成绩
}p1;              //定义一:定义变量p1

struct student p2;//定义二:定义结构体变量p2

struct student p3 = { 1,"bai","nan",99.9 };//初始化一
struct student p4 = { .sex = "nan",.name = "ran",.id = 2,.scorce = 88.8 };//二:指定顺序初始化

 

结构体嵌套结构体 

//出生日期数据
struct Data
{
    int year;  
    int month;
    int day;
};
struct student
{
    int id;       //学号
    char name[5]; //名字
    char sex[4];  //性别
    double scorce;//成绩
    struct Data birthday;//结构体嵌套结构体
}a1 = { 1,"bai","nan",99.9,{2003,8,27} };         //结构体嵌套初始化一

struct student a2 = { .birthday = {2006,8,23},.id = 2,.name = "ran",.scorce = 88.8,.sex = "nan" };//结构体嵌套初始化二

 

 结构体访问成员

方式一:使用 . 访问

struct student
{
	int id;       //学号
	char name[5]; //名字
	char sex[4];  //性别
	double scorce;//成绩
}p1;              //定义一:定义变量p1

struct student p2;//定义二:定义结构体变量p2

struct student p3 = { 1,"bai","nan",99.9 };//初始化一
struct student p4 = { .sex = "nan",.name = "ran",.id = 2,.scorce = 88.8 };//二:指定顺序初始化

int main()
{
	printf("id = %d\nname = %s\nsex = %s\nscorce = %.2lf\n", p3.id, p3.name, p3.sex, p3.scorce);//用 . 访问成员

	return 0;
}

 


 

方式二:用指针访问

struct student
{
	int id;       //学号
	char name[5]; //名字
	char sex[4];  //性别
	double scorce;//成绩
}p1;              //定义一:定义变量p1

struct student p2;//定义二:定义结构体变量p2

struct student p3 = { 1,"bai","nan",99.9 };//初始化一
struct student p4 = { .sex = "nan",.name = "ran",.id = 2,.scorce = 88.8 };//二:指定顺序初始化

int main()
{
	//访问成员方式一
	printf("id = %d\nname = %s\nsex = %s\nscorce = %.2lf\n", p3.id, p3.name, p3.sex, p3.scorce);//用 . 访问成员
	//访问成员方式二
	struct student* t = &p4;
	printf("id = %d\nname = %s\nsex = %s\nscorce = %.2lf\n", t->id, t->name, t->sex, t->scorce);//用指针->访问成员

	return 0;
}

 

(*p). 成员名( .  的优先级高于 * ,(*p)两边括号不能少)


 

 结构体与函数

struct student
{
	int id;       //学号
	char name[5]; //名字
	char sex[4];  //性别
	double scorce;//成绩
};

void print(struct student* p)//形参:结构体指针变量
{
	printf("id = %d\nname = %s\n", p->id, p->name);//打印学号和名字
}
int main()
{
	struct student p = { 1,"bai","nan",99.9 };//定义p和初始化
	print(&p);//传p的地址
	return 0;
}

 

控制台输出:


结构体内存对齐

对齐规则

1.结构体的第⼀个成员对齐到和结构体变量起始位置偏移量为0的地址处

2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处

  对齐数 = 编译器默认的⼀个对齐数与该成员变量大小的较小值。

  VS默认对齐数为8

  Linux中gcc没有默认对⻬数,对齐数就是成员自身的大小

3. 结构体总大小为最⼤对齐数(结构体中每个成员变量都有⼀个对齐数,所有对齐数中最⼤的)的整数倍。

4. 嵌套结构体,嵌套的结构体成员对齐到自己的成员中最⼤对齐数的整数倍处,结构体的整体大小就是所有最⼤对齐数(含嵌套结构体中成员的对齐数)的整数倍

先看下面👇两段代码


 

示例 

①段代码

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

int main()
{
	printf("%zd\n", sizeof(struct s1));
	return 0;
}

 

②段代码 

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

int main()
{
	printf("%zd\n", sizeof(struct s1));
	return 0;
}

 

 代码结果解释:

 
③段代码:嵌套结构体

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

struct S2
{
char c1;
struct S1 s1;
double d;
};


int main()
{
	printf("%zd\n", sizeof(struct S2));
	return 0;
}

 

代码结果解释

 

小结:结构体的内存对齐是拿空间来换取时间的做法。


 

修改默认对齐数 

#pragma (一个预处理指令):可以改变编译器的默认对齐数

#pragma pack(1)  //设置默认对齐数为1
struct s1
{
	char c1;
	char c2;
	int i;
};

//#pragma pack()  //取消默认对齐数,还原为默认
int main()
{
	printf("%zd\n", sizeof(struct s1));
	return 0;
}

 

控制台输出:6


 ***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

“你只管去做,不要在意别人的目光,最后的结果总是会让人满意的”。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走吧。

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

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

相关文章

docker容器镜像管理

目录 一、 Docker的基本组成 二、 容器和镜像的关系 2.1 面向对象角度 2.2 从镜像容器角度 三、镜像命令 3.1 查看当前已有镜像 3.2 查看已有的全部镜像 3.3 查看镜像ID 3.4 镜像删除 四、 容器命令 4.1 下载镜像 4.2 新建和启动容器 run 4.3 交互式 4.…

【体验有奖】用 AI 画春天,函数计算搭建 Stable Diffusion WebUI

人工智能生成内容 AIGC(Artificial Intelligence Generated Content)是当下备受关注的概念之一,是继 PGC 和 UGC 之后的新型生产方式。AIGC 技术的核心思想是利用人工智能算法生成具有一定创意和质量的内容。例如,根据用户的描述或…

字符分类函数(iscntrl、i是space.....)---c语言

目录 一、定义二、字符分类函数2.1 -iscntrl()2.1.1定义2.1.2使用举例 2.2 -isspace()2.2.1描述2.2.2使用举例 2.3-isdigit()2.3.1描述2.3.2使用举例 2.4-isxdigit()2.4.1描述 2.5-islower()2.5.1描述2.5.2使用举例 2.6-isupper()…

jenkins容器中安装python遇到问题

在Jenkins容器中安装配置Python时遇到问题 执行./configure --prefix/opt/python3/时遇到configure: error: no acceptable C compiler found in $PATH 这个问题就是缺少gcc编译环境。将gcc安装上即可: yum install -y gcc##前提是容器里的系统是cenos才可以&#…

专升本 C语言笔记-06 常用的3种输入输出函数

1.scanf() 与 printf() 的使用 scanf() 格式化输入数据 格式:scanf("格式控制字符串",参数地址列表) scanf("%d,%d,%d",&a,&b,&c); printf("a %d\n",a); printf("b %d\n",b); printf("c %d\n",c); 注意 注…

(网络安全)一款强大的逆向分析工具,开源!

工具介绍 Ghidra 是由美国国家安全局(NSA)研究部门开发的软件逆向工程(SRE)套件,用于支持网络安全任务。包括一套功能齐全的高端软件分析工具,使用户能够在各种平台(Windows、Mac OS和Linux)分析编译后的代…

详解VXLAN

海翎光电的小编今天为大家介绍了什么是VXLAN,以及VXLAN的基本概念和工作原理。 什么是VXLAN VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网),是由IETF定义的NVO3(Network Virtualization ov…

深入解析FastAPI多线程:加速代码执行效率

在现代网络应用中,高性能和快速响应是至关重要的,Python 的 FastAPI 框架以其出色的性能和简单易用的特点,成为了许多开发者的首选。然而,在某些场景下,单线程运行可能无法满足需求,这时候就需要考虑使用多…

RPC通信原理(一)

RPC通信原理 RPC的概念 如果现在我有一个电商项目,用户要查询订单,自然而然是通过Service接口来调用订单的实现类。 我们把用户模块和订单模块都放在一起,打包成一个war包,然后再tomcat上运行,tomcat占有一个进程&am…

vue模板语法介绍及内置指令用法

1、文本差值(大括号、v-text、v-htm指令) 最基本的数据绑定就是文本差值,格式为“Mustache”语法(双大括号); 双大括号只能解析文本不能解析html,如需解析html则需使用v-html指令;…

【四 (2)数据可视化之 Matplotlib 常用图表及代码实现 】

目录 文章导航一、介绍二、安装Matplotlib三、导入Matplotlib四、设置可以中文显示四、常用图形1、散点图(Scatter Plot)2.1、线性图(Line Plot)2.2、堆叠折线图2.3、多图例折线图3.1、柱状图/条形图(Bar Chart&#x…

AI基础知识问答(1)

1.什么是线性判别分析法(FDA)? 线性判别分析是一种对于监督数据降维的经典方法。通过对数据标准化,求得类内散度矩阵和类间散度矩阵,寻找一个投影矩阵W,使得同类样例的投影点尽可能接近,异类样…

使用采购管理软件构建更高效的采购模式

采购流程是企业整个采购部门的关键要素。无论企业规模大小,构建采购流程的模式都将直接影响企业控制成本、管理风险和保持流程弹性的能力。 下面我们将解释采购模式的类型、优缺点,以及如何确定哪种模式最适合你的采购部门。 集中采购的优缺点 在集中采…

HTML小游戏26 —— HTML5密室逃生游戏(附完整源码)

💂 网站推荐:【神级源码资源网】【摸鱼小游戏】 【工具大全】🤟 基于Web端打造的:👉【轻量化工具创作平台】💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【学习交流群】 本节教程我会带大家使用 HTML 、…

编程入行指南:从代码小白到技术大牛的“码农”奇幻漂流

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 在这个飞速发展的信息时代,技术不断推陈出新,程序员若想保持行业翘楚地位,必须持续汲取新知、…

SQLiteC/C++接口详细介绍之sqlite3类(十六)

返回目录:SQLite—免费开源数据库系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(十五) 下一篇: SQLiteC/C接口详细介绍之sqlite3类(十七)(未发表) 50.sqlite…

相机sd卡照片删除后数据恢复,相机sd卡中的照片被删除后如何恢复数据

当我们使用相机拍摄照片时,有时会不小心删除了一些重要的照片。这可能是因为误操作、SD卡故障或者其他原因。无论是珍贵的照片、还是重要的工作文件,被删除后,我们往往会感到焦虑和失望。相机sd卡中的照片被删除后如何恢复数据?幸…

Windows下安装双版本Python环境安装

前言 根据自己电脑系统选择所需版本进行下载,本次以Windows11环境为展示案例 本机系统查看 例如Windows11,进入系统即可查看本机信息 Python环境安装 Python下载 Python 3 下载 Python 2 下载,在历史版本中找到Python 2 最新版进行下载…

YOLOv7-Openvino和ONNXRuntime推理【CPU】

纯检测系列: YOLOv5-Openvino和ONNXRuntime推理【CPU】 YOLOv6-Openvino和ONNXRuntime推理【CPU】 YOLOv8-Openvino和ONNXRuntime推理【CPU】 YOLOv7-Openvino和ONNXRuntime推理【CPU】 YOLOv9-Openvino和ONNXRuntime推理【CPU】 跟踪系列: YOLOv5/6/7-O…

vscode 生成树状图工具:project-tree

按下快捷键“CtrlShiftP”, 在弹框中输入 Project Tree,然后敲回车即会在根目录自动生成README.md(如果之前没有的话)。