自定义类型之结构体

news2024/9/25 17:20:19

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk

      ⸝⋆   ━━━┓
     - 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━  ➴ ⷯ

本人座右铭 :   欲达高峰,必忍其痛;欲戴王冠,必承其重。

👑💎💎👑💎💎👑 
💎💎💎自💎💎💎
💎💎💎信💎💎💎
👑💎💎 💎💎👑    希望在看完我的此篇博客后可以对你有帮助哟

👑👑💎💎💎👑👑   此外,希望各位大佬们在看完后,可以互赞互关一下,看到必回
👑👑👑💎👑👑👑   

 

在我们做项目的时候,我们需要使用的数据类型 是多样的,这就需要对数据的类型进行分装,比如我们要做一个学生信息管理系统,这里就需要一个自定义的学生类型,里面包含学生的学号,姓名,成绩,性别........



一·结构体类型的定义

1.什么是结构体

结构体是一些值的集合,而这些值又是具有不同的数据类型

在这里我们不禁想起数组:相同类型的值的集合

2.结构体类型的定义

 struct tag       / /关键字 struct不能少,关键字+结构体名字

{

 member-list;   //成员列表

} variable-list;  //结构体变量的列表,注意分号不能少

 小试牛刀一下:

 

二·结构体变量的创建

对于变量的创建有2种方法

1)在声明类型的同时进行变量的创建

2)声明完结构体类型之后进行变量创建

注意匿名结构体的使用:匿名结构体就是没有结构体名字,这种结构体只能使用一次,一般不建议这样写

三·结构体变量的初始化

1.创建变量 的同时进行初始化
struct Student
{
	int num;   //学号
	char name[20];   //姓名
	char sex[10];     // 性别
	int score[5];     //成绩
}stu1 = { 01,"lisi","man",{45,56,78,45,36} }, stu2 = { 02,"wnagwu","man",{45,74,85,96,75} };
2.指定结构体成员进行初始化

指定成员进行初始化这里需要借助成员访问符 .

注意当是结构体指针的时候,我们需要借助 ->来进行访问

struct Student
{
	int num;   //学号
	char name[20];   //姓名
	char sex[10];     // 性别
	int score[5];     //成绩
}stu1 = { .num = 01,.name = "lisi",.sex = "man",.score = {45,56,78,45,36} };

 以下这样也是可以的

}
struct Student
{
	int num;   //学号
	char name[20];   //姓名
	char sex[10];     // 性别
	int score[5];     //成绩
};
int main()
{
	struct Student stu1 = { .num = 01,.name = "lisi",.sex = "man",.score = {45,56,78,45,36} };
	return 0; 
}

四·结构体变量的访问

借助 . (成员访问符)进行访问

struct Student
{
	int num;   //学号
	char name[20];   //姓名
	char sex[10];     // 性别
	int score[5];     //成绩
};
int main()
{
	struct Student stu1 = { .num = 01,.name = "lisi",.sex = "man",.score = {45,56,78,45,36} };
	printf("%d\n", stu1.num);//访问stu1的num成员
	printf("%s\n", stu1.name);//访问stu1的name成员
	return 0; 
}

五·结构体的内存对齐以及结构体的大小

1.对齐的规则

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

1. 第一个成员在与结构体变量偏移量为0的地址处。

2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的值为8

3. 结构体总大小最大对齐数(每个成员变量都有一个对齐数)的整数倍

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍

 2.应用

 分析:

对于a:占4个字节,对齐数是4

对于b:占1个字节,对齐数是1

对于c:占1个字节,对齐数 是1

此时总大小:6 ,但它不是最大对齐数4的整数倍所以最终结构体总大小是8

struct A
{
	char b;
	int a;
	char c;

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

 此时对应大小是9,但不是最大对齐数4的整数倍,所以最终结构体大小是12

七·结构体的传参

void Print(struct Student stu)
{
	printf("%d\n", stu.num);
}
void Print1(struct Student* stu)
{
	printf("%d\n", stu->num);
}
int main()
{
	//printf("%d\n", sizeof(struct A));//12
	//printf("%d\n", sizeof(struct B));//
	struct Student stu;
	Print(stu);
	Print1( &stu);
	return 0; 
}

 通过对比这个打印函数,我们不难发现,一个是传结构体的值,一个是传址

对于传值而言:形参和实参是2个对立的空间,当我们结构体的大小是非常大的时候,我们要是借助传值,这对内存的 开销是非常大的

对于传址来说,我们只需把这个地址传过去即可,对于这个地址的大小无非就是4 / 8个字节

相对而言我们是比较节省内存的

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

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

相关文章

操作系统 应用题 例题+参考答案(考研真题)

1.(考研真题)一个多道批处理系统中仅有P1和P2两个作业,P2比P1晚5ms到达,它们的计算和I/O操作顺序如下。 P1:计算60ms,I/O 80ms,计算20ms。 P2:计算120ms,I/O 40ms&…

会声会影2024出来了吗?会声会影2023怎么使用?

会声会影20247中文旗舰版 Corel VideoStudio 是一款功能强大的视频编辑软件,可以帮助用户创建高质量的视频作品。它提供了一系列完善的编辑功能,包括视频编辑、音频编辑、调色、特效、字幕、标题等。它还支持多种视频格式,可以将视频转换为多…

算法通关村第十二关-青铜挑战字符串

大家好我是苏麟 , 今天带来字符串专题 . 转换成小写字母 描述 : 给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 题目 : LeetCode 709.转换成小写字母 : 709. 转换成小写字母 分析 : 这个题可以先遍历整个字符串…

django+drf+vue 简单系统搭建 (4) 用户权限

权限控制是web中的重要组成部分。与以往的博客系统不同,本次工具页面仅支持注册用户。 每个注册用户都能访问到工具页面,并且提交自己的task来选择具体的工具来处理自己提交的文件。每个注册用户都只能访问到自己提交的task,而管理员则可以查…

uni-app:实现request请求的递归(设置request请求的访问次数),并且调用自定义方法给出返回值

一、效果展示 失败效果 成功效果 二、写入后端请求部分 分析 ①自定义一个模块common.js主要用于封装所有的请求函数 ②核心代码 function requestWithRetry(cmd, username, password, retryCount) {return new Promise((resolve, reject) > {uni.request({url: ip sys…

智能座舱架构与芯片- (13) 软件篇 下

四、面向服务的智能座舱软件架构 4.1 面向信号的软件架构 随着汽车电子电气架构向中央计算-域控制器的方向演进,甚至向车云一体化的方向迈进,适用于汽车的软件平台也需要进行相应的进化。 在传统的观念中,座舱域即娱乐域,座舱软…

【网络通信】浅析UDP与TCP协议的奥秘

在现代互联网中,UDP(用户数据报协议)和TCP(传输控制协议)是两种最常用的传输协议,它们被广泛应用于网络数据传输。尽管这两种协议都可以用来在网络上传输数据,但它们在设计目标、特点和适用场景…

Cesium 加载geojson数据类型点线面

1.获取geojson数据,本地新建一个.ts文件放置数据导出,并引入 获取geojson数据: DataV.GeoAtlas地理小工具系列 import { scGeojson } from ./geojson; 2.加载面 const addPolygonEvt () > {viewer.dataSources.add(Cesium.GeoJsonDataSo…

vue中data属性为什么是一个函数?

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue-data属性 目录 为什么data属性是一个函数而不是一个对象? 一、实例和组件定义dat…

golang指针学习

package mainimport "fmt"func main() {name:"飞雪无情"nameP:&name//取地址fmt.Println("name变量的内存地址为:",&name)fmt.Println("name变量的值为:",name)fmt.Println("name变量的内存地址为:",nameP)fmt.Prin…

【CSH 入门基础 9 -- 输出 csh 脚本中每一句命令】

文章目录 输出csh脚本中每一句命令 输出csh脚本中每一句命令 在 csh 或 tcsh 脚本中,如果你想要输出脚本中的每一句执行,你可以在脚本的开头使用 -v(verbose)选项。这个选项会使得 shell 在执行命令前先打印出来。 要在脚本中使…

Macs Fan Control Pro:掌握您的Mac风扇,提升散热效率

在Mac的世界里,每一个细节都显得格外重要。而其中,风扇的控制与调节则显得尤为重要。然而,原生的Mac系统并不提供直观的风扇控制工具,这使得许多Mac用户在处理高负荷任务时,风扇无法有效地进行散热,导致机器…

HugeGraph安装与使用

1、HugeGraph-Server与HugeGraph-Hubble下载 HugeGraph官方地址:https://hugegraph.apache.org/ 环境为:linux 官网是有模块版本对应关系,尽量下载较新版本,hubble1.5.0之前是studio功能比较少。官网已经下架server,其他模块下载也比较慢。可以在网上找…

Android13 新增 Stable AIDL接口

问题描述: 我需要在netd aidl 中添加新的接口: 设置网卡MAC地址: void setHardwareAddress(in utf8InCpp String iface, in utf8InCpp String hwAddr); 背景: Android 10 添加了对稳定的 Android 接口定义语言 (AIDL) 的支持&…

ros2机器人上位机与下位机连接方式(转载)

从硬件连接、通信协议和软件设计开发,上位机如何控制下位机? 由你创科技2023-09-07 10:38广东 随着科技的不断发展,自动化控制系统已经广泛应用于各个行业。在自动化控制系统中,上位机和下位机是两个重要的组成部分。上位机主要…

海外IP代理科普——API代理

随着互联网的不断发展,越来越多的企业开始使用API(应用程序接口)来实现数据的共享和交流。而在API使用中,海外代理IP也逐渐普及。那么,什么是API代理IP呢?它有什么作用?API接口有何用处&#xf…

Vue 3实战:打造交互丰富的任务管理应用

Vue 3实战:打造交互丰富的任务管理应用 前言搭建Vue 3项目步骤 1: 安装Vue CLI 3步骤 2: 创建Vue 3项目步骤 3: 进入项目目录步骤 4: 启动项目步骤 5: 查看项目结构 组件设计与复用1. **组件的职责单一化:**2. **Props传递:**3. **插槽(Slots&#xff09…

虚拟机里为什么桥接模式可以广播,NAT模式不能广播?

在虚拟机网络配置中,桥接模式(Bridged mode)允许虚拟机在与主机相同的网络上作为一个独立的设备出现。这意味着虚拟机可以接收和发送广播消息,就像物理机器一样,因为它们处于同一个物理网络上。 相反,NAT模…

合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(三)

基于ARM语音识别的智能家居系统 我们上一篇,我们实现在Linux系统下编译程序,我们首先通过两个小练习来熟悉一下如何去编译。今天,我们来介绍一下LCD屏幕基本使用。 一、LCD屏幕基本使用 如何使用LCD屏幕? 1、打开开发板LCD设…

(02)vite环境变量配置

文章目录 将开发环境和生产环境区分开环境变量vite处理环境变量loadEnv 业务代码需要使用环境变量.env.env.development.env.test修改VITE_前缀 将开发环境和生产环境区分开 分别创建三个vite 的配置文件,并将它们引入vite.config.js vite.base.config.js import…