自定义类型之结构体

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇: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.mzph.cn/news/156693.shtml

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

相关文章

Altium Designer学习笔记5

整体修改元件标号: 重置Reset Schematic Designators: 恢复之前的状态。复位,恢复之前的状态。

安防视频监控管理平台EasyCVR定制首页开发与实现

视频监控平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视…

使用Kafka、Flink、Druid构建实时数据系统架构

1. 背景 对于很多数据团队来说,要满足实时需求并不容易。为什么?因为作流程(数据采集、预处理、分析、结果保存)涉及大量等待。等待数据发送到 ETL 工具,等待数据批量处理,等待数据加载到数据仓库中&#…

Vulhub靶场-KIOPTRIX: LEVEL 1.1

目录 环境配置 端口扫描 漏送发现 漏送利用 提权(内核漏洞提权) 环境配置 环境配置的过程同主页该专栏第一个靶场,不在赘述。 端口扫描 首先通过arp-scan并根据靶机的mac地址确定靶机的IP地址 然后对靶机进行一个扫描 首先扫描到OpenS…

C++--STL学习笔记

参考教程:黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili 软件界一直希望建立一种可重复利用的东西,C的面向对象和泛型编程思想,目的就是复用性的提升。 大多情况下,数据结构和算法都未能有一套标准,…

线程(线程基本概念、java实现多线程、使用多线程、线程的生命周期、线程同步、线程死锁)

(一)线程基本概念 一、 程序, 进程, 线程的概念 程序: 使用某种语言编写一组指令(代码)的集合,静态的 进程: 运行的程序,表示程序一次完整的执行, 当程序运行完成, 进程也就结束了 个人电脑: CPU 单个, 双核, CPU的时间分片, 抢占式 每个独立执行的程…

OpenCV快速入门:目标检测——轮廓检测、轮廓的距、点集拟合和二维码检测

文章目录 前言一、轮廓检测1.1 图像轮廓的概念1.2 轮廓检测算法简介1.3 轮廓检测基本步骤1.4 轮廓检测函数说明1.4.1 轮廓发现1.4.2 轮廓面积1.4.3 轮廓周长1.4.4 轮廓外接多边形1.4.5 点到轮廓距离1.4.6 凸包检测 1.5 轮廓检测代码实现 二、轮廓的距2.1 几何距2.2 中心距2.3 H…

ssh远程连接不了虚拟机ubuntu

直奔主题 1. 确保linux安装了ssh2.查看网络适配器是否启用3.连接成功 1. 确保linux安装了ssh sudo apt-get install openssh-server2.查看网络适配器是否启用 3.连接成功

VBA技术资料MF85:将工作簿批量另存为PDF文件

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…

如何实现车机体验”遥遥领先”?头部玩家已经给出答案

车机与手机的深度融合,通过跨终端互联互通实现全场景、沉浸式的用户体验,正在成为各大高端智能汽车品牌的新战场。 此前,已经有华为、苹果几大手机巨头已经纷纷开启“造车”业务,同时吉利等车企也反向进入手机领域,各…

TransmittableThreadLocal - 线程池中也可以传递参数了

一、InheritableThreadLocal的不足 InheritableThreadLocal可以用于主子线程之间传递参数,但是它必须要求在主线程中手动创建的子线程才可以获取到主线程设置的参数,不能够通过线程池的方式调用。 但是现在我们实际的项目开发中,一般都是采…

快来看看你的手表是否有忘记关闭的应用在后台偷偷耗电?

在这个智能化的时代,手表已经不仅仅是用来看时间的工具,它更是我们生活的助手,从消息提醒到健康监测,它似乎无所不能。但与此同时,你是否注意到手表电量的续航有时长,有时慢?有可能,…

C语言每日一题(33)随机链表的复制

力扣138 随机链表的复制 题目描述 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都…

解锁OpenAI潜力:OpenAI 全面解析与最佳实践

该项目是由OpenAI公司提供的一个大型代码库,其中包含了各类与OpenAI API相关的代码示例和最佳实践。 此项目名为OpenAI Cookbook,目的是为了帮助使用者更有效地利用OpenAI API,将其应用于自己的工作和生活中。具体来说,可以解决一…

打码平台之图鉴的使用步骤

打码平台之图鉴 背景: ​ 今天给大家推荐一个我一直使用的验证码识别平台,图鉴,我没有收费,我只是觉得这个网站使用方便,支持验证码种类多,好了,话不多说,上教程! 注册…

SmartX 超融合 5.1 版本有哪些新特性和技术提升?

近日,SmartX 正式发布了超融合产品组合 SmartX HCI 5.1 版本,以全面升级的超融合软件、分布式块存储、容器管理与服务、软件定义的网络与安全等组件,为虚拟化和容器负载在计算、存储、网络和管理层面提供统一的架构和生产级别的能力支持。本期…

2024年测试工程师必看文章系列之python+pytest接口自动化(1)-接口测试

一般我们所说的接口即API,那什么又是API呢,百度给的定义如下: API(Application Programming Interface,应用程序接口)是一些预先定义的接口(如函数、HTTP接口),或指软件系…

如何在AIX操作系统上修改Java环境变量

AIX操作系统是IBM的Unix操作系统,通常用于企业级应用和服务器环境。在AIX上配置Java环境变量是执行Java应用程序和开发Java代码的重要步骤。本文将详细介绍如何在AIX上修改Java环境变量,并提供具体示例来帮助你完成这个任务。 步骤1:确定Java…

matlab如何实现任意长序列所有排列方式

最近被问到一个问题,如何计算一个由3个0和3个1组成的序列的所有组合情况,处理这个问题我没有找到特别恰当的函数(如果有能直接做的函数欢迎评论告知),所以采用比较接近需求的perms函数来解决这个问题 首先看perms函数…

许战海战略文库|三步成就技术品牌:奥迪如何打造Quattro技术品牌?

引言:在当前全球化和信息化快速发展的背景下,技术品牌的打造不仅是企业竞争力提升的重要途径,也是企业实现长远发展的基石。技术品牌的建设并非一蹴而就的过程,而是需要企业准确把握市场趋势发掘自身核心竞争力,并通过长期的积累和推广逐渐在市场中树立起良好的技术…