//重命名结构体指针名
//typedef将使得原来申明的结构体变量成为数据类型
typedef stu_t* p2stu_t;
//创建结构体指针,存放某一个结构体变量的首地址
//stu_t * p0,p6,p7=NULL; //!!!错误,这样赋值p0是指针,p6,p7是结构体类型
p2stu_t p2stu = NULL;
p2stu_t p1,p2,p3=NULL;
stu_t students[5] = {}; //结构体初始化
********************************************************************************
for (int i=0; i<2; i++) {
students[i].sid = i+1;
printf("请输入第%d个学员的姓名:",students[i].sid);
scanf("%s",students[i].name);
printf("请输入第%d个学员的年龄:",students[i].sid);
scanf("%d",&students[i].age);
}
printf("\n+++++++++++++++++++++++++++++++++\n");
printf("学号\t\t姓名\t\t\t年龄\n");
int j=0;
for (p2stu=students,j=0; j<2; p2stu++,j++) {
printf("%d\t\t%s\t\t%d\n",p2stu->sid,p2stu->name,p2stu->age);
}
char buffer[512] = ""; //静态申请内存
#include <stdlib.h>
stu->name = (char*)malloc(20); //动态内存空间申请
malloc申请的空间在内存的堆空间.任何函数都能使用,对空间的使用是全局的,
使用时须传递该空间的首地址
//第一条学生记录的姓名的内存空间被释放
free(students->name);
students->name = NULL;
if (stu->name == NULL) {
printf("内存空间不足,程序退出.\n");
exit(-1);
}
//学生记录的姓名的内存空间被全部释放
for (int i=0; i<3; i++) {
free(students[i].name);
free(students[i].name); //同一个malloc的地址被释放两次程序将崩溃(已经是null的没关系)
students[i].name = NULL;
}
************************************结构体指针数组******************************
stu_t* studentps[5] = null;
//链接列表
typedef struct stu{
int sid;
char name[20];
int age;
struct stu * right;
struct stu * left; //结构体的递归指针
}stu_t, *p2stu_t;
typedef struct{
int mid;
char name[20];
int age;
//struct* right ——>error:匿名结构体不能声明结构体递归指针/用来封装结构体,
} member_t;