Skip to content

2.11.2 结构体的定义

2.11.2 结构体的定义

基本定义格式

struct 名字 { 数据类型 数据1; 数据类型 数据2; ... };

示例

struct info
{
    char name[20];
    int id;
    char sex;
};


数据的初始化和赋值

好了,现在我们创建好了一个结构体了 那么该怎么利用它呢?

最基本的方法,我们创建一个结构体变量

struct info stu;//创建一个名为stu的,结构体类型为info的结构体变量

现在stu就是一个以info为模板的变量了

如果我们想调用stu里面的内容,那么我们可以加个点 例如

printf("name:%s\n", stu.name);
printf("id:%d\n", stu.id);
printf("sex:%c\n", stu.sex);

那么该怎么赋值呢? 好问题 其实我们学会调用,赋值也就不难了

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 结构体类型* 名字; 示例

struct info* stu;

而如果要调用,自然就是 (*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 结构体类型 名字[大小];

示例

struct info list[50];//存储50个学生信息的数组

如果要调用,那就是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函数的返回值是什么