1 需求
以录入学生信息(姓名、学号、性别、出生日期)为例,首先通过键盘输入需要录入的学生的数量,再依次输入这些学生的信息,输入完成后输出所有信息。
2 代码
#include<stdio.h>
#include<stdlib.h>
// 定义结构体,并取别名为Date
typedef struct {
int year;
int month;
int day;
}Date;
// 定义结构体,并取别名为Student
typedef struct {
char name[9];
char number[5];
char sex[3];
Date birthday; // 内嵌结构体Date
}Student;
int main() {
int count;
printf("请输入需要录入的学生数量:");
scanf("%d", &count);
printf("\n请依次输入每个学生的信息:\n\n姓名\t学号\t性别\t出生日期\n");
// 由于不能使用变量定义数组Student stuArray[count];
// 所以采用指针,并通过动态内存分配来实现
// 在堆中申请一部分连续的内存空间用来存储输入的信息
// 并使Student *类型的指针变量stuPoint指向此空间的首地址
Student *stuPoint = (Student*)malloc(count * sizeof(Student));
// 动态内存分配可能失败,若失败,则程序直接退出
if (stuPoint == NULL) {
exit(1);
}
// 定义第二个指针stuTempPoint1,使它和stuPoint指向同一个位置
// 当输入完一个学生后,stuTempPoint1往下移,直至输入完所有学生
// 输入完所有学生后,该指针就指向了没有学生信息的位置(相当于“废了”)
// 其实呢,也可以继续用,只要再往上移,移回去就行了
Student *stuTempPoint1 = stuPoint;
for(int i = 0; i < count; i++, stuTempPoint1++) {
scanf("%s%s%s%d%d%d",
stuTempPoint1 -> name,
stuTempPoint1 -> number,
stuTempPoint1 -> sex,
&stuTempPoint1 -> birthday.year,
&stuTempPoint1 -> birthday.month,
&stuTempPoint1 -> birthday.day
);
}
printf("\n\n================================\n\n");
// 定义第三个指针stuTempPoint2,使它和stuPoint指向同一个位置
// 每输出完一个学生信息后,指针下移,全部输出完毕后该指针也相当于“跪了”
Student *stuTempPoint2 = stuPoint;
for(int i = 0; i < count; i++, stuTempPoint2++) {
printf("姓名:%s\t学号:%s\t性别:%s\t出生日期:%d年%d月%d日\n",
stuTempPoint2 -> name,
stuTempPoint2 -> number,
stuTempPoint2 -> sex,
stuTempPoint2 -> birthday.year,
stuTempPoint2 -> birthday.month,
stuTempPoint2 -> birthday.day
);
}
printf("\n\nstuTempPoint1指针往上移之后,再次利用================================\n\n");
// 回到原始位置
stuTempPoint1 -= count;
// 再一顿输出
for(int i = 0; i < count; i++, stuTempPoint1++) {
printf("姓名:%s\t学号:%s\t性别:%s\t出生日期:%d年%d月%d日\n",
stuTempPoint1 -> name,
stuTempPoint1 -> number,
stuTempPoint1 -> sex,
stuTempPoint1 -> birthday.year,
stuTempPoint1 -> birthday.month,
stuTempPoint1 -> birthday.day
);
}
// 释放刚刚申请的内存空间(一定要释放!)
free(stuPoint);
return 0;
}