2.11.2 结构体的定义
2.11.2 结构体的定义
基本定义格式
struct 名字 { 数据类型 数据1; 数据类型 数据2; ... };
示例
数据的初始化和赋值
好了,现在我们创建好了一个结构体了 那么该怎么利用它呢?
最基本的方法,我们创建一个结构体变量
现在stu就是一个以info为模板的变量了
如果我们想调用stu里面的内容,那么我们可以加个点 例如
那么该怎么赋值呢? 好问题 其实我们学会调用,赋值也就不难了
int input;
printf("请输入学生的学号:");
scanf("%d", &input);
stu.id = input;
printf("\n请输入学生的姓名:");
char name[20];
scanf("%s", name);
strcpy(stu.name, name);
char sex;
printf("\n请输入学生的性别:");
getchar(); //吞掉上一次输入后按下回车键后留下的回车
scanf("%c", &sex);
stu.sex = sex;
关于getchar是什么,我在本小节的最后进行一个详细的解释
结构体指针
除了像上面那样直接利用,我们也可以用指针对结构体进行操作
定义一个结构体指针的方法如下 struct 结构体类型* 名字; 示例
而如果要调用,自然就是 (*stu).id 这样。括号不能省略,因为 . 号的优先级是比 * 号更高的。
不过这个写法太常见了,所以专门为它发明了一个简写法: stu->id 。
那么,我们上面的程序就会变成下面这样
//初始化一个结构体指针
struct info* stu;
// 赶紧给它分配空间,空间大小就是结构体的大小。
// 没有这一步的话,下面的操作就都变成给野指针写入数据了。
stu = (struct info*) malloc(sizeof(struct info));
//输入
int input;
printf("请输入学生的学号:");
scanf("%d", &input);
stu->id = input;
printf("\n请输入学生的姓名:");
char name[20];
scanf("%s", name);
strcpy(stu->name, name);
char sex;
printf("\n请输入学生的性别:");
getchar(); //吞掉上一次输入后按下回车键后留下的回车
scanf("%c", &sex);
stu->sex = sex;
//输出
printf("\n");
printf("name:%s\n", stu->name);
printf("id:%d\n", stu->id);
printf("sex:%c\n", stu->sex);
free(stu);
结构体数组
学习了定义一个结构体变量,那么定义多个想必也显而易见了 格式 struct 结构体类型 名字[大小];
示例
如果要调用,那就是list[i].id这种
嵌套结构体
我们前面已经讨论过用结构体存储变量、数组的事情
那么,结构体内能不能存储结构体呢? 能,还真能
举个例子
struct info
{
char name[20];
int id;
char sex;
};
struct class
{
struct info student[50];
int index;
int grade;
};
我们直接把一个结构体当成一个数据类型,直接大大方方用就行
关于getchar
我们先介绍一个概念:缓冲区
缓冲区就是读取我们输入的数据并暂时存储的地方
当我们用scanf输入完毕,按下回车之后,数据就会从缓冲区发到对应的位置
但是话又说回来了
我们按下回车以后留下了一个\n,这个没从缓冲区带走,流了下来
而下次scanf的时候,发现缓冲区里还有东西,就不会再向我们询问,而是直接拿走缓冲区里的东西
所以我们的换行就直接被scanf拿走并放到sex里了
而getchar()就是从缓冲区中拿走第一位数据 也就是把缓冲区的换行拿走
当然,getchar()也有返回值,是读取的数据对应的ascii码
当然,这个返回值不接收也无所谓。就像我们从来不会考虑scanf函数的返回值是什么