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

#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就是根据这个模板填写的具体的一张表格。
- 内存分配 : 当这行代码执行时,系统会在栈(Stack)上为
第三部分:输入数据(核心交互)

scanf的细节:
&stu1.ID:ID是long类型的基本变量,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 个学生的信息,可以定义结构体数组:
