当前位置: 首页 > news >正文

C语言结构体:学生信息统计实战

学生信息统计--结构体

把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出它各个成员的值。

#include <stdio.h>
struct Student
{
long ID;
char name[50];
char sex[50];
char addr[100];
};
int main()
{
struct Student stu1;

printf("请输入学生信息:\n");

printf("请输入学号: \n");
scanf("%ld", &stu1.ID);

printf("请输入姓名: \n");
scanf("%s", stu1.name);

printf("请输入性别 (男/女): \n");
scanf("%s", stu1.sex);

printf("请输入住址: \n");
scanf("%s", stu1.addr);

printf("\n--- 您录入的信息如下 ---\n");
printf("学号: %ld\n", stu1.ID);
printf("姓名: %s\n", stu1.name);
printf("性别: %s\n", stu1.sex);
printf("住址: %s\n", stu1.addr);

return 0;
}

1. 代码逐行解析:

第一部分:头文件与结构体定义

struct Student { ... };: 这里定义了一个新的数据类型,名为struct Student

  • 概念: 在 C 语言中,基本数据类型(如int,float,char)只能存储单一类型的数据。但现实世界中,一个“学生”包含学号(长整型)、姓名(字符串)、性别(字符串)、住址(字符串)等多种信息。结构体就是为了解决这个问题而诞生的,它允许我们将这些不同类型的数据“打包”在一起,形成一个整体。
  • 成员变量: 大括号{}内的变量称为结构体的成员(Members)
    • long ID;: 存储学号。
    • char name[50];: 存储姓名,是一个字符数组。
    • char sex[50];: 存储性别。
    • char addr[100];: 存储住址。
  • 注意: 定义结束时别忘了分号;。此时并没有分配内存,只是告诉编译器“有这么一种数据类型”。

第二部分:主函数与变量声明

  • struct Student stu1;: 这里使用了刚才定义的类型来声明一个具体的变量stu1
    • 内存分配: 当这行代码执行时,系统会在栈(Stack)上为stu1分配一块连续的内存空间。这块空间的大小大致等于所有成员大小之和(考虑到内存对齐,实际大小可能会略大)。
    • 类比: 如果struct Student是“学生档案表”的模板,那么stu1就是根据这个模板填写的具体的一张表格

第三部分:输入数据(核心交互)

scanf的细节:

  • &stu1.ID:IDlong类型的基本变量,scanf需要变量的地址,所以必须加取地址符&

第四部分:输出数据

  • 同样使用.运算符获取成员的值,并通过printf格式化输出。
  • %ld对应long%s对应字符串(字符数组)。

2. 结构体(Struct)核心知识拓展:

这段代码是一个非常经典的 C 语言入门示例,主要展示了结构体(struct)的定义变量声明成员访问以及基本的输入输出操作。

A. 为什么需要结构体?

在没有结构体之前,如果要处理一个学生的信息,你可能需要定义三个独立的数组:

这样做的缺点是:数据是分散的。如果你要交换两个学生的信息,你需要同时交换这三个数组中对应下标的数据,非常容易出错且代码冗余。
结构体将逻辑上相关的数据聚合在一起,使得操作(如赋值、传递、交换)可以针对“整个对象”进行,提高了代码的可读性和可维护性。

B. 结构体的内存布局与对齐

虽然我们在定义时写了long+char[50]+char[50]+char[100],但sizeof(struct Student)的结果往往不等于这些成员大小的简单相加。

  • 内存对齐(Memory Alignment): 为了提高 CPU 读取数据的效率,编译器会在成员之间插入填充字节(Padding),确保每个成员的起始地址是其自身大小的整数倍(或者是编译器设定的对齐系数)。
  • 优化技巧: 为了节省内存,通常建议将占用空间大的成员放在前面,占用空间小的放在后面,以减少填充空隙。

C. 结构体指针

在处理大量数据(如学生列表)时,直接传递结构体变量效率较低(因为会发生内存拷贝)。通常使用结构体指针。

箭头运算符->是 C 语言中操作结构体指针的专用语法糖。

D. 结构体数组

如果要存储全班 50 个学生的信息,可以定义结构体数组:

http://www.jsqmd.com/news/526502/

相关文章:

  • 制造业痛点破解!纸质手写记录单→Excel结构化汇总,旗讯数字OCR方案实操落地
  • OpenClaw+Qwen3.5-4B-Claude:低成本打造24小时代码助手
  • OpenClaw+飞书AI机器人授权过期失效解决方案
  • 2026年口碑好的铝板品牌推荐:辊涂铝板/冲孔铝板销售厂家推荐 - 品牌宣传支持者
  • HarmonyOS 6实战4:网络代理设置与取消的完整解决方案
  • Typora集成BEYOND REALITY Z-Image:Markdown文档可视化增强
  • LLaMA-Factory模型导出全攻略:从GGUF转换到Ollama本地化部署(含LangChain向量提取示例)
  • Python的__init_subclass__中的健壮框架
  • 从ChatExcel到AI Agent:元空AI Claw如何重构办公自动化?
  • 产品设计师福音!Nano-Banana轻松搞定Knolling风格拆解图
  • 暑期实习与秋招的笔试错题记录
  • 【手眼标定实战】基于ROS+UR5e+Realsense D435i的eye-in-hand标定全流程解析
  • Java面试还不懂Spring源码,看这篇就够了!
  • 关于TSP的P=NP解法:海岸线猜想SeaLine(再续之三)ubuntu lazarus sqlite
  • 2026西南65mn弹簧带钢优质厂家推荐榜:65mn弹簧带钢购买/65mn弹簧带钢采购/淬火带钢厂商/淬火带钢批发/选择指南 - 优质品牌商家
  • PS批量给图片加文字?这个自动化技巧让你效率翻倍(附详细步骤)
  • 基于Cosmos-Reason1-7B和LSTM的时序数据预测融合模型实践
  • 告别手动标注!PP-DocLayoutV3一键识别文档版面,效率提升10倍
  • 运算放大器实战:如何用同相放大电路实现精确电压增益(附计算公式推导)
  • CentOS 8下TigerVNC多用户配置全攻略:从安装到避坑
  • 2026年热门的农业机器人厂家推荐:田园管理农业机器人厂家精选 - 品牌宣传支持者
  • RetinaFace镜像免配置教程:无需pip install,直接运行inference_retinaface.py
  • Chord视频分析API安全防护实践
  • PDF-Parser-1.0亲测:复杂PDF也能准确解析,效果惊艳
  • Kettle自定义插件实现ClickHouse无缝连接
  • centos虚拟机忘记密码怎么办
  • OpenClaw多模型路由策略:百川2-13B与CodeLlama-7B任务分配
  • 2026成都心理咨询品牌推荐榜:心理疗愈/成都心理专家/成都心理医生/成都心理咨询专家/成都心理咨询中心/成都心理咨询师/选择指南 - 优质品牌商家
  • 电磁场仿真-主题022-并行电磁仿真
  • 2026年热门的铝合金家具品牌推荐:环保铝合金家具/防水防潮铝合金家具/江苏蜂窝板铝合金家具推荐厂家 - 品牌宣传支持者