结构体<C语言>

导言

结构体是C语言中的一种自定义类型,它的值(成员变量)可以是多个,且这些值可以为不同类型,这也是和数组的主要区别,下面将介绍它的一些基本用法,包括:结构体的创建、结构体变量的声明、初始化、结构体的访问、结构体的内存对齐等。


目录

导言

结构体的创建

结构体变量的声明

结构体成员的初始化、访问

结构体的内存对齐


结构体的创建

struct stu {//比如描述一个学生
	char name[10];//名字
	int age;//年龄
	int score;// 得分
};

结构体变量的声明

常用的有以下3种:

1.在结构体创建时同时声明结构体变量:

struct stu {//比如描述一个学生
	char name[10];//名字
	int age;//年龄
	int score;// 得分
}stu1,stu2;//声明了stu1和stu2

2.先创建结构体,后声明(包括在函数内部声明):

//2.先创建结构体,后初始化:
struct stu {//比如描述一个学生
	char name[10];//名字
	int age;//年龄
	int score;// 得分
};
struct stu stu1, stu2;

3.使用typedef先重命名,再声明:

//3.使用typedef先重命名,再声明: 
typedef struct stu {//比如描述一个学生
	char name[10];//名字
	int age;//年龄
	int score;// 得分
}stu;//当前面使用typedef时,分号前不再是变量声明,而是重命名后的类型

stu stu1, stu2;//声明了stu1和stu2

关于typedef重命名结构体,也可先创建结构体,再重命名:

struct stu{
	char name[10];//名字
	int age;//年龄
	int score;// 得分
};

typedef struct  stu stu;

stu stu1, stu2;

结构体的特殊声明:匿名结构体:

结构体成员的初始化、访问

初始化:

按顺序初始化:

struct stu {//比如描述一个学生
	char name[10];//名字
	int age;//年龄
	int score;// 得分
};

int main() {
	struct stu stu1 = { "mariiy",18,89 };//按顺序初始化
	return 0;
}

不按顺序初始化:

格式:.成员名=初始值

struct stu {//比如描述一个学生
	char name[10];//名字
	int age;//年龄
	int score;// 得分
};

int main() {
	struct stu stu1 = { .age=19,.name="joke",.score=90};//不按顺序初始化
	return 0;
}

访问:

直接使用变量名(操作符“.”)

格式:变量名.成员名

使用指针(操作符“->”)

格式:结构体指针->成员名


结构体的内存对齐

结构体的内存对齐描述了结构体成员在内存中的存储位置,是决定结构体内存大小的重要因素。

因为结构体内存对齐的因素存在,两个存储着同等数量、类型的结构体,会因为成员在结构体内部顺序的不同,导致占用内存大小的不同。

如:

 这时结构体大小为16字节。

我们变换一下顺序(将score移到第二位)

  这时结构体大小为20字节。

两个结构体内的成员类型、个数完全一样,只是声明顺序不一样,导致结构体大小不一样。

对齐规则:

●结构体的第一个成员对齐到偏移量为0结构体变量的起始地址处。

●其他成员要对齐到对齐数的整数倍数处(偏移量的整数倍)

        对齐数:编译器默认的对齐数与成员类型大小的较小值(数组类型大小为成员类型大小

        —vs上默认对齐数是8

        —Linux没有默认对齐数,对齐数就是成员类型大小

●结构体的总大小为最大对齐数(所有成员的对齐数中最大的那个)的最小整数倍

●如果嵌套了结构体,结构体成员会对起到它的最大对齐数(不会再与编译器的默认对齐数比较)的整数倍数处

所以我们可以分析在上面的两个结构体中内存布局:

内存布局:

 

 

 内存布局:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ Primer Plus第五版笔记(p201-250)

第六章 函数(下) 在含有return语句的循环后面应该也有一条return语句 不要返回局部对象的引用或指针,当函数结束时临时对象占用的空间也就随之释放掉了,所以两条return语句都指向了不再可用的内存空间。 如果函数返回指针、引用…

今日成果2024-6-7 TrustZone TEE安全SDK开发指南

Rockchip Vendor Storage Application Note.pdf OK 开机下,可以实现Vendor Storage的读写。 0ms时同步RTC时间 OK Rockchip_Developer_Guide_TEE_SDK_CN.pdf 什么是TrustZone 此系统方法意味着可以保护安全内存、加密块、键盘和屏幕等外设,从而可确…

GIS之arcgis系列07:conda环境下安装arcpy环境

首先将python27环境下的“Desktop10.8.pth”拷贝到anaconda环境下。 路径如下(仅参考): C:\Python27\ArcGIS10.8\Lib\site-packages\Desktop10.8.pth D:\Anaconda\Lib\site-packages 在anaconda prompt中穿创建一个新环境 conda create -…

CentOS 7 下gdb任意版本的升级

文章目录 前言查看gdb版本升级步骤 小结 前言 在做项目的过程中,遇到了难缠的bug,使用gdb调试的时候,bt调用堆栈看的一震头疼,于是就想起把gdb升级一下 当前环境:Centos7,gdb:7.6 稍微好看了那…

CD工具AWX之作业模板与工作流模板

一、概要 本文以php和h5项目为示例,讲述从初始化项目到更新发布的实现详情。 它们跟java/go等进程程序不同,只需要下发.php等静态文件即可,不涉及进程的重启。 对于php项目,除了php文件外,还包括.env配置文件。&…

java之IO流和集合框架的笔记

1 File类的使用 1.1 概述 File类及本章下的各种流,都定义在java.io包下。 一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录(俗称文件夹),与平台无关。(体会万事万物皆对象) File 能新建、删…

Android14音频进阶之CarAudioManager::getOutputDeviceForUsage流程分析(七十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

经典神经网络(11)VQ-VAE模型及其在MNIST数据集上的应用

经典神经网络(11)VQ-VAE模型及其在MNIST数据集上的应用 我们之前已经了解了PixelCNN模型。 经典神经网络(10)PixelCNN模型、Gated PixelCNN模型及其在MNIST数据集上的应用 今天,我们了解下DeepMind在2017年提出的一种基于离散隐变量(Discrete Latent va…

网页五子棋对战项目测试(selenium+Junit5)

目录 网页五子棋对战项目介绍 网页五子棋对战测试的思维导图​ 网页五子棋对战的UI自动化测试 测试一:测试注册界面 测试二:测试登陆界面 测试三:测试游戏大厅界面 测试四:测试游戏房间界面以及观战房间界面 测试五&#…

使用开源的zip.cpp和unzip.cpp实现压缩包的创建与解压(附源码)

目录 1、使用场景 2、压缩包的创建 3、压缩包的解压 4、CloseZipZ和CloseZipU两接口的区别 5、开源zip.cpp和unzip.cpp文件的下载 VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排…

Redis集群(5)

集群原理 节点通信 通信流程 在分布式存储系统中,维护节点元数据(如节点负责的数据、节点的故障状态等)是关键任务。常见的元数据维护方式分为集中式和P2P方式。Redis集群采用P2P的Gossip协议,这种协议的工作原理是节点之间不断…

使用 FormCreate 快速创建仿真页面

在现代前端开发中,快速创建和迭代仿真页面是提高开发效率和用户体验的关键。FormCreate 是一个强大的工具,它通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单组件,支持多种 UI 框架。本文将介绍如何使用 FormCreate 快速创建一个…

svg图标封装--基于vue2适配uniapp全端

第一步&#xff1a;新建svg目录 在static目录下新建svg目录,后将所有svg图标都放到此文件夹 第二步&#xff1a;封装注册全局组件 (注意&#xff1a;在根目录下新建components文件夹) 代码实现&#xff1a; <template><!-- svg图标 --><image :style"{ …

【python】OpenCV—Background Estimation(15)

文章目录 中值滤波中值滤波得到图像背景移动侦测 学习来自 OpenCV基础&#xff08;14&#xff09;OpenCV在视频中的简单背景估计 中值滤波 中值滤波是一种非线性平滑技术&#xff0c;主要用于数字信号处理&#xff0c;特别是在图像处理中去除噪声。 一、定义与原理 定义&am…

MATLAB算法实战应用案例精讲-【数模应用】多分类Logit分析(附python、R语言和MATLAB代码实现)

目录 算法原理 成对类别有序logit 簇族数据中的超散布性 条件独立性检验 SPSS-有序多分类Logistic回归 SPSSAU 参照项设置 案例应用 代码实现 R语言 逻辑回归 决策树 随机森林 支持向量机 评价分类的准确性 MATLAB python 算法原理 成对类别有序logit libr…

maven基本操作和配置(idea版基础版)

写在前面&#xff1a;为一位朋友写的一个博客&#xff0c;有需要都可以查看&#xff01; 一、maven是什么&#xff1f; 一句话&#xff1a;管理依赖工具&#xff0c;统一项目结构便于开发&#xff0c;把项目开发和管理的过程抽象成对象模型来管理&#xff08;pom模型&#xf…

Milvus 2.4 向量库安装部署

1、linux 已有docker环境 2、安装fio命令 yum install -y fio 2、mkdir test-data fio --rwwrite --ioenginesync --fdatasync1 --directorytest-data --size2200m --bs2300 --namemytest ctrlc 3、lscpu 4、docker -v 6、安装docker compose组件 yum -y install python3-…

八、C语言:操作符详解

一、移位操作符 1.1左移操作 左边丢弃&#xff0c;右边补0 1.2右移操作 算数右移&#xff1a;右边丢弃&#xff0c;左边补原符号位 逻辑右移&#xff1a;右边丢弃&#xff0c;左边补0 int main() {int a -1;int b a >> 1;printf("b%d\n",b);return 0; } 原码…

贪吃蛇小游戏简单制作-C语言

文章目录 游戏背景介绍实现目标适合人群所需技术浅玩Window API什么是API控制台程序窗口大小,名称设置 Handle(句柄)获取句柄 坐标结构体设置光标位置 光标属性获取光标属性设置光标属性 按键信息获取 贪吃蛇游戏设计游戏前的初始化设置窗口的大小和名称本地化设置 宽字符Waht …

采用PHP开发的一套(项目源码)医疗安全(不良)事件报告系统源码:统计分析,持续整改,完成闭环管理

采用PHP开发的一套&#xff08;项目源码&#xff09;医疗安全&#xff08;不良&#xff09;事件报告系统源码&#xff1a;统计分析&#xff0c;持续整改&#xff0c;完成闭环管理 医疗安全确实是医疗领域中不容忽视的重要问题。医院不良安全事件&#xff0c;即医疗质量安全不良…