c语言中数据结构

一、结构体的由来

1. 数据类型的不足

C语言中,基本数据类型只有整型、字符型、浮点型等少数几种,无法满足复杂数据类型的需要。

2. 数组的限制

虽然数组可以存储多个同类型的数据,但是数组中的元素个数是固定的,无法动态地改变大小。

3. 指针的局限性

指针只能指向一个变量,无法同时指向多个变量。

为了解决以上问题,C语言引入了结构体(struct)这一复合数据类型。结构体是由一组不同类型的变量组成的集合,可以方便地表示复杂的数据结构。
在这里插入图片描述

二、结构体的使用方法

1. 定义结构体类型

使用关键字struct和大括号{}来定义结构体类型,其中包含若干个成员变量。例如:

struct Student {
    char name[20];
    int age;
    float score;
};

上述代码定义了一个名为Student的结构体类型,它包含三个成员变量:name(字符串类型)、age(整型)和score(浮点型)。

2. 声明结构体变量

声明结构体变量时,需要指定其类型为已定义的结构体类型。例如:

struct Student stu1, stu2;

上述代码声明了两个Student类型的结构体变量stu1和stu2。

3. 访问结构体成员变量

通过“.”运算符来访问结构体变量中的成员变量。例如:

strcpy(stu1.name, "Tom");
stu1.age = 18;
stu1.score = 90.5;

上述代码分别给stu1的name、age和score成员变量赋值。
在这里插入图片描述

三、结构体在计算机中的存储方式

1. 内存对齐

为了提高内存读写效率,编译器会对结构体进行内存对齐。内存对齐是指将结构体中的成员变量按照一定的规则排列在内存中,使得它们的地址都是某个特定值的倍数。例如,对于一个int类型的变量,它的地址必须是4的倍数;对于一个char类型的变量,它的地址必须是1的倍数。如果某个成员变量按照默认对齐方式排列后,其地址不是某个特定值的倍数,编译器会在其前面填充一些空白字节,使其地址变为某个特定值的倍数。例如:

struct Student {
    char name[20]; // 地址为0x00000000,不需要对齐
    int age;       // 地址为0x00000004,需要对齐,填充2个空白字节(即地址为0x00000004)
    float score;   // 地址为0x00000008,需要对齐,填充3个空白字节(即地址为0x00000008)
};

2. 结构体的大小计算

结构体的大小等于其所有成员变量的大小之和。如果成员变量之间有空白字节,那么这些空白字节也会被计算在内。例如:

struct Student {
    char name[20]; // 占用20个字节(包括末尾的'\0')
    int age;       // 占用4个字节(假设为int类型)
    float score;   // 占用4个字节(假设为float类型)
};

上述代码中,Student结构体的大小为24个字节(20+4+4=28),因为name数组后面有3个空白字节(即sizeof(name)=23)。需要注意的是,不同的编译器可能会对结构体的内存对齐方式和大小计算方法有所不同。因此,在编写程序时应该尽量避免依赖于具体的内存布局细节。

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

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

相关文章

Unity VR Pico apk安装失败:INSTALL_FAILED_UPDATE_INCOMPATIBLE

我的报错: PICO4企业版。安装apk,报错“安装失败。(所属的Unity项目打包的apk,被我在同一台pico4安装了20次) 调试方法: PIco4发布使用UNITY开发的Vr应用,格式为apk,安装的时候发生…

SQL手工注入漏洞测试(MySQL数据库)

一、实验平台 https://www.mozhe.cn/bug/detail/elRHc1BCd2VIckQxbjduMG9BVCtkZz09bW96aGUmozhe 二、实验目标 获取到网站的KEY,并提交完成靶场。 三、实验步骤 ①、启动靶机,进行访问查找可能存在注入的页面 ②、通过测试判断注入点的位置(id) (1)…

嵌入式-stm32-用PWM点亮LED实现呼吸灯

一:知识前置 1.1、LED灯怎么才能亮? 答:LED需要低电平才能亮,高电平是灯灭。 1.2、LED灯为什么可以越来越亮,越来越暗? 答:这是用到不同占空比来实现的,控制LED实现呼吸灯&…

matlab时间转换

采集的GNSS数据是10hz的。 data(选取其中一部分)如下: (1)char类型 formatOut yyyy-mm-dd HH:MM:SS; str datestr(data,formatOut); str如下: (2)double类型 DateVector dat…

STM32独立看门狗

时钟频率 40KHZ 看门狗简介 STM32F10xxx 内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看 门狗设备 ( 独立看门狗和窗口看门狗 ) 可用来检测和解决由软件错误引起的故障;当计数器达到给 定的超时值时,触发一个中…

WU反走样算法

WU反走样算法 由离散量表示连续量而引起的失真称为走样,用于减轻走样现象的技术成为反走样,游戏中称为抗锯齿。走样是连续图形离散为想想点后引起的失真,真实像素面积不为 零。走样是光栅扫描显示器的一种固有现象,只能减轻&…

Drogon Win11 编译 /MT

Drogon是一个基于C17/20的Http应用框架,使用Drogon可以方便的使用C构建各种类型的Web应用服务端程序。 Drogon的主要应用平台是Linux,也支持Mac OS、FreeBSD和Windows。 它的主要特点如下: 网络层使用基于epoll(macOS/FreeBSD下是kqueue)的…

nginx反向代理服务器及负载均衡服务配置

一、正向代理与反向代理 正向代理:是一个位于客户端和原始服务器(oricin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户…

Matlab/Simulink的一些功能用法笔记(3)

01--引言 最近加入到一个项目组,有一些测试需要去支持,通过了解原先团队的测试方法后,自己作了如下改善,大大提高了工作效率。这也许就是软件开发的意义吧,能够去除一些重复的机械的人工操作并且结果还非常不可靠。 …

Discrete Time Signals and Systems

Discrete Time Signals and Systems 文章目录 Discrete Time Signals and SystemsSignal classificationbasic signalOperation on signalSystem of discrete signalLinear systems and nonlinear systemsCausal and non-causal SystemsTime-varying and time-invariant system…

助力打造清洁环境,基于美团最新YOLOv6-4.0开发构建公共场景下垃圾堆放垃圾桶溢出检测识别系统

公共社区环境生活垃圾基本上是我们每个人每天几乎都无法避免的一个问题,公共环境下垃圾投放点都会有固定的值班时间,但是考虑到实际扔垃圾的无规律性,往往会出现在无人值守的时段内垃圾堆放垃圾桶溢出等问题,有些容易扩散的垃圾比…

使用travelbook架设自己的实时位置共享服务

travelbook 是一款开源的安卓APP,它能以低功耗提供实时位置共享,它包含功能如下: 好友之间分享实时位置;记录行程轨迹;标记收藏地点; 这款软件的主要解决的问题包括: 场景1:查看老…

【开源】基于Vue+SpringBoot的新能源电池回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

安防视频云平台/可视化监控云平台EasyCVR如何快速定位占用大量存储空间的文件?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

【Vue2+3入门到实战】(4)Vue基础之指令修饰符 、v-bind对样式增强的操作、v-model应用于其他表单元素 详细示例

目录 一、今日学习目标1.指令补充 二、指令修饰符1.什么是指令修饰符?2.按键修饰符3.v-model修饰符4.事件修饰符 三、v-bind对样式控制的增强-操作class1.语法:2.对象语法3.数组语法4.代码练习 四、京东秒杀-tab栏切换导航高亮1.需求:2.准备代…

小白的实验室服务器深度学习环境配置指南

安装nvidia 本文在ubuntu server 22.04上实验成功,其他版本仅供参考 注意,本文仅适用于ubuntu server,不需要图形界面,没有对图形界面进行特殊考虑和验证!依赖图形操作界面的读者慎用 查看是否安装了gcc gcc -v若没…

如何快速删除pdf周围的空白

问题:写论文往往需要pdf格式的图片,但pdf往往四周存在大量空白需要手动截图很麻烦 解决: 打开命令行输入:pdfcrop 图片名.pdf

【Mysql】InnoDB统计数据的收集(十三)

我们前边在计算查询成本的时候会用到一些统计数据,比如通过 SHOW TABLE STATUS 可以看到关于表的统计数据,通过 SHOW INDEX 可以看到关于某个索引的统计数据,那么这些统计数据是怎么来的呢?本章节将分享 InnoDB 存储引擎的统计数据…

深圳锐科达SIP矿用电话模块SV-2801VP

深圳锐科达SIP矿用电话模块SV-2801VP 一、简介 SV-2800VP系列模块是我司设计研发的一款用于井下的矿用IP音频传输模块,可用此模块打造一套低延迟、高效率、高灵活和多扩展的IP矿用广播对讲系统,亦可对传统煤矿电话系统加装此模块,进行智能化…

在Vue3中使用vue-qrcode库实现二维码生成

本文主要介绍在Vue3中使用qrcode库实现二维码生成的方法。 目录 一、基础用法实现vue-qrcode库的参数介绍 在Vue3中实现二维码生成需要使用第三方库来处理生成二维码的逻辑。常用的库有 qrcode和 vue-qrcode。 一、基础用法实现 在Vue3中使用vue-qrcode库实现二维码生成的方…
最新文章