【C语言篇】探索 C 语言结构体:从基础语法到数据组织的初体验
我的个人主页
我的专栏:C语言,希望能帮助到大家!!!点赞❤ 收藏❤
目录
- 什么是结构体
- 结构体的定义与使用
- 结构体内存布局
- 嵌套结构体与指针
- 结构体数组的操作
- 结构体与函数
- 结构体内存对齐机制
- 位域与结构体的结合
- 动态内存分配与结构体
- 常见错误及调试技巧
- 实战案例:基于结构体的学生管理系统
1. 什么是结构体
在C语言中,结构体(
struct
)是一种用户定义的数据类型,用于将不同类型的变量组合在一起。它允许我们定义复杂的数据类型,便于更直观地表示现实中的对象。关键点:
- 结构体可以存储不同类型的数据。
- 适合需要组织复杂数据的场景。
2. 结构体的定义与使用
2.1 定义结构体
定义一个结构体时需要使用关键字 struct
。以下是基本语法:
#include <stdio.h>struct Student {int id; // 学号char name[50]; // 姓名float score; // 成绩
};
2.2 声明和初始化结构体变量
struct Student student1 = {1, "Alice", 95.5};
2.3 访问结构体成员
通过点运算符(.
)访问成员:
printf("学号: %d\n", student1.id);
printf("姓名: %s\n", student1.name);
printf("成绩: %.2f\n", student1.score);
3. 结构体内存布局
结构体在内存中的存储取决于其成员的排列顺序和对齐方式。以下代码用于分析内存布局:
#include <stdio.h>struct Example {char c;int i;double d;
};int main() {struct Example e;printf("结构体大小: %zu 字节\n", sizeof(e));return 0;
}
输出示例:
结构体大小: 16 字节
4. 嵌套结构体与指针
4.1 嵌套结构体
struct Address {char city[50];int zipCode;
};struct Person {char name[50];struct Address address;
};
4.2 结构体指针
struct Student *ptr = &student1;
printf("姓名: %s\n", ptr->name); // 使用 -> 访问成员
5. 结构体数组的操作
结构体数组用于存储多个结构体变量:
struct Student students[3] = {{1, "Alice", 90.0},{2, "Bob", 85.5},{3, "Charlie", 88.0}
};for (int i = 0; i < 3; i++) {printf("学号: %d, 姓名: %s, 成绩: %.2f\n", students[i].id, students[i].name, students[i].score);
}
6. 结构体与函数
6.1 传递结构体参数
按值传递会复制整个结构体,效率较低:
void printStudent(struct Student s) {printf("学号: %d, 姓名: %s, 成绩: %.2f\n", s.id, s.name, s.score);
}
按指针传递更高效:
void printStudentPtr(const struct Student *s) {printf("学号: %d, 姓名: %s, 成绩: %.2f\n", s->id, s->name, s->score);
}
7. 结构体内存对齐机制
C语言编译器会根据平台规定对结构体进行对齐优化,确保高效访问。
7.1 对齐规则
- 每个成员的地址是其类型大小的整数倍。
- 结构体的总大小是其最大对齐单位的倍数。
8. 位域与结构体的结合
位域允许我们压缩存储多个布尔值或小整数:
struct BitField {unsigned int a : 1;unsigned int b : 3;unsigned int c : 4;
};
9. 动态内存分配与结构体
结合 malloc
动态分配结构体内存:
#include <stdlib.h>struct Student *student = (struct Student *)malloc(sizeof(struct Student));
student->id = 1;
strcpy(student->name, "Alice");
student->score = 95.0;
free(student);
10. 常见错误及调试技巧
- 忘记为指针分配内存。
- 忽略结构体大小对齐规则。
- 在未初始化的结构体上操作。
11. 实战案例:基于结构体的学生管理系统
设计一个管理学生信息的程序,支持添加、删除、查询操作。
11.1 数据结构设计
struct Student {int id;char name[50];float score;
};
11.2 主函数实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX 100struct Student {int id;char name[50];float score;
};struct Student students[MAX];
int count = 0;void addStudent(int id, const char *name, float score) {students[count].id = id;strcpy(students[count].name, name);students[count].score = score;count++;
}void printStudents() {for (int i = 0; i < count; i++) {printf("学号: %d, 姓名: %s, 成绩: %.2f\n", students[i].id, students[i].name, students[i].score);}
}int main() {addStudent(1, "Alice", 90.5);addStudent(2, "Bob", 85.0);printStudents();return 0;
}
相关文章:

【C语言篇】探索 C 语言结构体:从基础语法到数据组织的初体验
我的个人主页 我的专栏:C语言,希望能帮助到大家!!!点赞❤ 收藏❤ 目录 什么是结构体结构体的定义与使用结构体内存布局嵌套结构体与指针结构体数组的操作结构体与函数结构体内存对齐机制位域与结构体的结合动态内存分…...
linux下USB设备状态查询
linux下USB设备状态查询 linux下USB设备状态查询 在buildroot RK3568平台上调试USB视频采集时发现,USB设备经常性断开,为发现其断开的规律,编写脚本记录其断开的时间 linux下USB设备状态查询 #周期性查询 USB设备 cat > /usr/bin/usbenq…...

鼠标前进后退键改双击,键盘映射(AutoHotkey)
初衷: 1.大部分鼠标为不可自定义按键,可以自定义的又很贵。 鼠标左键是双击是很频类很高的操作,鼠标前进/后退按键个人感觉使用频率很低,因此把鼠标前进/后退改为双击还是很合适的。 2.有些短款的键盘没有Home或End键,…...
ubuntu服务器睡眠命令
在 Ubuntu 服务器中,通常不会启用系统睡眠(即 suspend)模式,因为服务器通常需要保持持续运行以提供服务。但如果你希望让 Ubuntu 服务器进入睡眠状态,你可以使用以下命令: 1. 让系统进入休眠(S…...

尚硅谷学习笔记——Java设计模式(一)设计模式七大原则
一、介绍 在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,提出的解决方案。我们希望我们的软件能够实现复用性、高稳定性、扩展性、维护性、代码重用性,所以…...

Flink——进行数据转换时,报:Recovery is suppressed by NoRestartBackoffTimeStrategy
热词统计案例: 用flink中的窗口函数(apply)读取kafka中数据,并对热词进行统计。 apply:全量聚合函数,指在窗口触发的时候才会对窗口内的所有数据进行一次计算(等窗口的数据到齐,才开始进行聚合…...

技能之发布自己的依赖到npm上
目录 开始 解决 步骤一: 步骤二: 步骤三: 运用 一直以为自己的项目在github上有了(之传了github)就可以进行npm install下载,有没有和我一样萌萌的同学。没事,萌萌乎乎的不犯罪。 偶然的机…...

COMSOL工作站:配置指南与性能优化
COMSOL Multiphysics 求解的问题类型相当广泛,提供了仿真单一物理场以及灵活耦合多个物理场的功能,供工程师和科研人员来精确分析各个工程领域的设备、工艺和流程。 软件内置的#模型开发器#包含完整的建模工作流程,可实现从几何建模、材料参数…...

Qt导出Excel图表
目的 就是利用Qt导出Excel图表,如果直接画Excel 图表,比较麻烦些,代码写得也复杂了;而直接利用Excel模块就简单了,图表在模块当中已经是现成的了,Qt程序只更改数据就可以了,这篇文章就是记录一下利用模块上…...

分布式协同 - 分布式系统的特性与互斥问题
文章目录 导图概述分布式系统的特性与挑战分布式互斥算法的目标分布式互斥算法集中互斥算法集中互斥算法示意图集中互斥算法流程 基于许可的互斥算法Lamport 算法示意图Lamport 流程 令牌环互斥算法令牌环互斥算法示意图 1. 集中互斥算法(Centralized Mutual Exclus…...

windows安装itop
本文介绍 win10 安装 itop 安装WAMP集成环境前 先安装visual c 安装itop前需要安装WAMP集成环境(windowsApacheMysqlPHP) 所需文件百度云盘 通过网盘分享的文件:itop.zip 链接: https://pan.baidu.com/s/1D5HrKdbyEaYBZ8_IebDQxQ 提取码: m9fh 步骤一࿱…...

LAMP环境的部署
一、软件安装介绍 在Linux系统中安装软件有rpm安装、yum安装、源码安装等方法,在这里主要给大家介绍 yum 安装,这是一种最简单方便的一种安装方法。 YUM(Yellow dog Upadate Modifie)是改进版的 RPM 管理器,很好地解…...
Go语言压缩文件处理
目录 Go 语言压缩文件处理1. 压缩文件:Zip函数2. 解压文件:UnZip 函数3. 小结 Go 语言压缩文件处理 在现代的应用开发中,处理压缩文件(如 .zip 格式)是常见的需求。Go 语言提供了内置的 archive/zip 包来处理 .zip 文…...

rocylinux9.4安装prometheus监控
一.上传软件包 具体的软件包如下,其中kubernetes-mixin是下载的监控kubernetes的一些监控规则、dashbaordd等。 二.Prometheus配置 1.promethes软件安装 #解压上传后的软件包 [rootlocalhost ] cd /opt [rootlocalhost opt]# tar xf prometheus-2.35.3.linux-amd…...

屏幕分辨率|尺寸|颜色深度指纹
一、前端通过window.screen接口获取屏幕分辨率 尺寸 颜色深度,横屏竖屏信息。 二、window.screen c接口实现: 1、third_party\blink\renderer\core\frame\screen.idl // https://drafts.csswg.org/cssom-view/#the-screen-interface[ExposedWindow ] …...
docker-elasticsearch-kibana-logstash
一、安装 Elasticsearch 尝试直接拉取 Elasticsearch 镜像: 执行 docker pull docker.elastic.co/elasticsearch/elasticsearch,拉取失败,错误提示为 “Error response from daemon: manifest for docker.elastic.co/elasticsearch/elasticse…...
C#设计模式——抽象工厂模式(重点)
文章目录 项目地址一、抽象工厂模式1.1 特性1.2 使用反射获取特性标记的类1.3 完整代码 项目地址 教程作者:教程地址: 代码仓库地址: 所用到的框架和插件: dbt airflow一、抽象工厂模式 工厂方法模式依然存在一个问题就是&…...

全新AI模型家族登场:完全可复现的开源语言模型OLMo 2
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

用Matlab和SIMULINK实现DPCM仿真和双边带调幅系统仿真
1、使用SIMULINK或Matlab实现DPCM仿真 1.1 DPCM原理 差分脉冲编码调制,简称DPCM,主要用于将模拟信号转换为数字信号,同时减少数据的冗余度以实现数据压缩。在DPCM中,信号的每个抽样值不是独立编码的,而是通过预测前一…...

RabbitMQ的交换机总结
1.direct交换机 2.fanout交换机...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...