14.C基础_结构体

news2025/1/12 19:59:39

定义与使用

1、定义

定义结构体:

定义结构体时,需要注意最后的分号必须加上。

定义结构体时,成员只去声明类型,不进行赋值。赋值在定义结构体变量时进行。

struct 结构体名{
    结构体成员列表
};                //注意这里的分号

定义结构体变量:

方法1:正常定义结构体变量

struct 结构体名 结构体变量名;

方法2:定义结构体时,定义结构体变量

struct 结构体名{
    结构体成员列表
}变量名1,变量名2; //直接在这里写变量名,变量名之间用,隔开               

2、初始化结构体变量

情况1:全部成员赋值

全部成员赋值就是在定义结构体变量后直接加上成员值,各个成员值之间用" , "分隔。

struct 结构体名 结构体变量名 = {依次赋值的成员值};

情况2:部分成员赋值

部分成员赋值需要在赋值时指定成员并赋值。

struct 结构体名 结构体变量名 = {
    .成员1 = 值,
    .成员2 = 值
};

情况3:定义结构体时,定义结构体变量的初始化

struct 结构体名{
    结构体成员列表
}变量名 = {成员值};

3、访问结构体变量

方式1:当为结构体变量时,用" . "来访问成员

方式2:当为结构体指针时,用" -> "来访问成员

结构体数组

结构体数组就是一个数组,它的成员是一个结构体变量。

定义与赋值:

定义与赋值的方法与一维数组完全一样。

struct 结构体名 数组名[数组大小] = {{第1个结构体成员初始化值},{第2个结构体成员初始化值}};

结构体嵌套结构体

结构体嵌套结构体就是结构体中成员的类型可以是结构体。

作用:

解决不同结构体中重复的、完全一样的部分

示例:

假设现在要创建两个结构体来管理学生、老师的信息。对于学生,有姓名、性别、学分这三个信息;对于老师,有姓名、性别、电话号码这三个信息。可以看到,在学生和老师的信息中姓名、性别这两个信息是重复的。因此可以建立一个结构体来封装它们,这样使得学生和老师的结构体定义变得更加简洁。

代码如下:

#include <stdio.h>
struct both{   //老师和学生共有的成员
	char* name;
	char* sex;
};
struct student{//学生信息结构体
	struct both stu;
	int score;
};
struct teacher{//老师信息结构体
	struct both tea;
	char* phone;
};

int main(){

	//struct both tBothStu = {"stuName","沃尔玛购物袋"};
	struct both tBothTea = {"teaName","纸扎投石车"};

	struct student stu1 = {{"stuName","沃尔玛购物袋"},100};//可以直接赋值结构体
	struct teacher tea1 = {tBothTea,"123124123"};//也可以通过定义的结构体进行初始化

	printf("stu1:name=%s  sex=%s  score=%d\n",\
			stu1.stu.name,\
			stu1.stu.sex,\
			stu1.score
		  );
	printf("tea1:name=%s  sex=%s  phone=%s\n",\
			tea1.tea.name,\
			tea1.tea.sex,\
			tea1.phone
		  );
	return 0;
}

运行结果如下: 

结构体的大小

字节对齐是什么:

对于结构体,编译器会自动对其成员变量进行对齐,以提高数据存取的效率。

结构体大小计算步骤:

相关名词:

  • 自身对齐:数据类型的大小就是自身对齐的大小,例如char为1,int为4
  • 默认对齐:与电脑位数有关。32位默认对齐为4,64位默认对齐为8
  • 有效对齐:有效对齐=min(自身对齐,默认对齐),是结构体中实际占用空间的大小
  • 存放地址:存放地址一定能够整除有效地址

计算步骤:(依次计算成员空间)

  1. 确定自己操作系统的位数,从而确定默认对齐方式
  2. 计算第一个成员,通过公式:" 有效对齐 = min(自身对齐,默认对齐) "计算有效对齐
  3. 查看当前的存放地址是否能够整除有效对齐字节数,不能整除需要补空间对齐。                    注意:补其后能够整除的数值是下一个变量的起始地址,并没有存储数据                            例如:补其后是12,那么实际的有数据的空间只到11                  
  4. 依次计算其他成员空间
  5. 查看最终存放地址是否能够整除" max(全部有效对齐) "

结构体大小手算示例:

假设有一个如下的结构体,在64位的操作系统下计算其结构体大小(假设起始地址为0x00)

struct test{
    char a;
    int b;
    char c;
    char d;
};

 列出如下表格,依次计算存储地址:

变量名类型自身对齐默认对齐有效对齐存储地址
achar18(64位)10 1 2 3
bint48(64位)44 5 6 7
cchar18(64位)18
dchar18(64位)19 10 11

计算a:可以计算出有效对齐为1,存储地址为0,可以整除,所以存储地址为0

计算b:可以计算出有效对齐为4,存储地址为1,不能整除,所以补齐到最小的可以整除4的地址,即:补齐到4。a的空间为0,1,2,3;b的空间为4,5,6,7这四个字节用于存储

计算c:可以计算出有效对齐为1,存储地址为8,可以整除,所以存储地址为8

计算d:可以计算出有效对齐为1,存储地址为9,可以整除,所以存储地址为9

整体大小计算:可以计算出max(全部有效对齐)=max(1,4,1,4)=4,存储地址9不能整除4,所以补齐到最小的可以整除4的地址,即:补齐到12。因此最终结构体大小为0~11,共12字节

补充练习:结构体大小手算例题 

例题1:

假设有一个如下的结构体,在64位的操作系统下计算其结构体大小(假设起始地址为0x00)

struct test{
    char a;
    short b;
    char c;
    char d;
};

 列出如下表格,依次计算存储地址:

变量名类型自身对齐默认对齐有效对齐存储地址
achar18(64位)10 1
bshort28(64位)22 3
cchar18(64位)14
dchar18(64位)15

 最终补齐地址为6,实际存储空间为0~5,6字节

例题2:

假设有一个如下的结构体,在64位的操作系统下计算其结构体大小(假设起始地址为0x00)

struct test{
    char a;
    double b;
    char c;
    char d;
};

 列出如下表格,依次计算存储地址:

变量名类型自身对齐默认对齐有效对齐存储地址
achar18(64位)10 1 2 3 4 5 6 7
bdouble88(64位)88 9 10 11 12 13 14 15
cchar18(64位)116
dchar18(64位)117 18 19 20 21 22 23

 最终补齐地址为24,实际存储空间为0~23,24字节

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

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

相关文章

Qt入门学什么?

Qt是一个跨平台的C图形用户界面应用程序框架&#xff0c;它为应用程序开发者提供建立图形界面所需的所有功能。Qt框架以其面向对象、易于扩展的特性而受到广泛欢迎&#xff0c;并且支持多种平台&#xff0c;包括桌面、嵌入式和移动平台 。 对于Qt的入门学习&#xff0c;可以通过…

uniapp+vue3的defineProps传递

//index.vue <view class"topic"><!-- 磨砂背景 --><view class"content"><matte v-for"(item,index) in 8" :key"index"></matte><matte isMore"false"></matte></view>&…

0成本学习Liunx系统【只需要一台笔记本电脑,无需购买云服务器】

【准备工作&#xff0c;需要软件】&#xff1a; 1&#xff1a;MobaXterm 【服务器连接工具&#xff08;免费开源&#xff09;】 2&#xff1a;CentOS-7-x86_64-DVD-2009.iso 【CentOS-7 镜像】 3&#xff1a;VirtualBox-7.0.20-163906-Win.exe 【虚拟机壳子】 4&…

朴素贝叶斯与决策树分类

朴素贝叶斯分类 1贝叶斯分类理论 选择高概率对应的类别 2条件概率 事件B发生的情况下&#xff0c;事件A发生的概率 &#x1d443;(&#x1d434;|&#x1d435;)&#x1d443;(&#x1d434;∩&#x1d435;)/&#x1d443;(&#x1d435;) > &#x1d443;(&#x1d43…

【前端面试】浏览器原理解读

前端进阶——浏览器篇-CSDN博客 浏览器工作原理与Javascript高级&#xff08;前后端异步&#xff09;-CSDN博客 DOM树的建立过程 前端DOM&#xff08;文档对象模型&#xff09;数的建立过程&#xff0c;实际上是浏览器解析HTML文档并构建DOM树的过程。这一过程大致可以分为以…

声音克隆GPT-SoVITS 2.0软件和详细的使用教程!

天命人&#xff0c;请允许我先蹭个热点&#xff01; 原始声音&#xff1a; 播放 克隆声音&#xff1a; 播放 文章写了一半&#xff0c;被《黑神话悟空》刷屏了。突发奇想&#xff0c;用里面的声音来做个素材试试看。 B站捞了一点声音素材&#xff0c;随便剪一剪&#xff0c…

IOS半越狱工具nathanlr越狱教程

简介 nathanlr 是一款半越狱工具&#xff0c;不是完整越狱。 半越狱只能使用一些系统范围的插件。 无法做到完整越狱 Dopamine 越狱一样插件兼容性。 nathanlr支持 iOS 16.5.1 – 16.6.1 系统。 支持 A12 及以上设备。 肯定有人问&#xff0c;为什么仅仅支持这些系统&#xff…

关于全球影像下载你需要知道这些参数

经常会有客户问我们&#xff0c;如果想要下载全球的影像应该怎么下载&#xff0c;这里我们用数字说话&#xff0c;为你介绍一下全球影像下载的那些关键参数。 TIF文件大小 在开始之前说明一下&#xff0c;以下表格中所有出现的级别均为标准级别&#xff0c;如果想对应水经微图…

Qt系列之数据库(一)

Qt 数据库开发是指在Qt框架下进行数据库操作的开发工作。Qt提供了一套强大的数据库模块&#xff0c;可以方便地与多种数据库进行交互&#xff0c;如SQLite、MySQL、PostgreSQL等。 该模块中接口是使用C语言&#xff0c;也就是说&#xff0c;学习相关的类及类的接口使用。 qt…

我的Markdown简历模板开源了!

我之前写过一篇文章&#xff0c;很详细的讲解了如何使用Markdown写出一份漂亮的简历&#xff0c;并且在各个博客平台都有发布。 为了方便&#xff0c;我在这贴一下这篇文章的链接&#xff1a;✨Markdown制作简历教程 如果你还没有读过&#xff0c;或者恰好需要做一份新的简历…

【Kubernetes】K8s中Container(容器)、Pod(小组)和node(节点)概念讲解

Kubernetes学习之路 第一章 Kubernetes学习入门之Container(容器)、Pod(小组)和node(节点)概念 文章目录 Kubernetes学习之路前言一、Container&#xff08;容器&#xff09;二、Pod&#xff08;小组&#xff09;1.单容器 Pod2.多容器 Pod 三、Container&#xff08;容器&…

132-横向移动-Exchange 服务有账户 CVE 漏洞无账户口令爆破

Exchange服务 Microsoft Exchange Server 是微软公司推出的一款企业级邮件服务器软件&#xff0c;它提供了一套全面的电子邮件服务组件&#xff0c;以及消息和协作系统。Exchange Server 不仅支持电子邮件服务&#xff0c;还提供了日历、联系人管理、任务管理、文档管理、实时会…

机器学习 之 决策树与随机森林的实现

引言 随着互联网技术的发展&#xff0c;垃圾邮件过滤已成为一项重要的任务。机器学习技术&#xff0c;尤其是决策树和随机森林&#xff0c;在解决这类问题时表现出色。本文将介绍随机森林的基本概念&#xff0c;并通过一个具体的案例——筛选垃圾电子邮件——来展示随机森林的…

【Qt】输入类控件QTextEdit

目录 输入类控件QTextEdit 例子&#xff1a;获取多行输入框的内容 例子&#xff1a;验证输入框的各种信号 输入类控件QTextEdit QTextEdit表示多行输入框&#xff0c;也是一个富文本&markdown编辑器。 并且能在内容超出编辑框范围时自动提供滚动条 在Qt中&#xff0c;有俩…

前端CSS选择器

css 和html 三种表示方式 行内样式 >内部样式>外部样式 元素选择器 属性选择器 id选择器 选择id为bb的 &#xff0c;给他增添样式 class选择器以 .开头 用法和id差不都 包含选择器和父子选择器 兄弟选择器 选择器组合 伪元素选择器 首字母格式不一样 首行格式不一样 …

java设计模式--创建型设计模式

创建型模式可分为&#xff1a;单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式 单例模式 单例模式 就是采取一定的方法保证在整个软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个获取其对象的方法&#xff08;静态方法&#xf…

Unity编辑器扩展之Project视图扩展

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity编辑器扩展之Project视图扩展 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff01…

河南萌新联赛2024第(六)场:郑州大学(补题ABCDFGIL)

文章目录 河南萌新联赛2024第&#xff08;六&#xff09;场&#xff1a;郑州大学A 装备二选一&#xff08;一&#xff09;简单介绍&#xff1a;思路&#xff1a;代码&#xff1a; B 百变吗喽简单介绍&#xff1a;思路&#xff1a;代码&#xff1a; C 16进制世界简单介绍&#x…

第二十七节、人物可互动标识

一、多个场景同时存在 方法&#xff1a;将另一个场景拖拽进 当前场景中 这样在一个场景中保存物体&#xff0c;另一个场景切换即可 创建一个场景名为上图&#xff08;这是一个持久化的场景&#xff09; 被激活的场景是粗体字的 二、代码 使用第二个代码获得player的子物体 …

uniapp在线下载安装包更新app以及热更新

首先用getSystemInfo判断平台、 再通过json文件模拟接口 判断版本号是否一致 不一致则下载服务器apk进行更新 外加网络波动导致失败重新下载更新包 uni.getSystemInfo({success: function (e) {// #ifndef H5// 获取手机系统版本const system e.system.toLowerCase();const pl…