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 个学生的信息,可以定义结构体数组:

相关推荐
爱吃生蚝的于勒2 小时前
【Linux】网络之http协议
linux·运维·服务器·网络·数据结构·c++·http
2501_945424802 小时前
高性能计算资源调度
开发语言·c++·算法
2301_776508722 小时前
C++中的组合模式变体
开发语言·c++·算法
历程里程碑2 小时前
44. TCP -23Linux聊天室实现命令符功能
java·linux·开发语言·数据结构·c++·排序算法·tcp
Frostnova丶2 小时前
LeetCode 1594.矩阵中最大的非负乘积
算法·leetcode·矩阵
We་ct2 小时前
LeetCode 162. 寻找峰值:二分高效求解
前端·算法·leetcode·typescript·二分·暴力
丶小鱼丶2 小时前
数据结构和算法之【二叉树】
java·数据结构·算法
hanlin032 小时前
刷题笔记:力扣第38题-外观数列
算法·leetcode
2301_793804692 小时前
模板代码安全性增强
开发语言·c++·算法