C语言结构体
目录
一、结构体概念
二、结构体名化简
三、结构体的使用
四、结构体的省略问题
一、结构体概念
在前面的学习中,我们可以很简单的把某一个人的姓名,年龄,身高体重,成绩等信息存储到计算机中,但是如果我们需要存储多个人的各种信息,我们就需要定义很多个变量并赋值,十分的麻烦,这时就需要我们的结构体
结构体就是一种自定义的数据类型,里面可以包含不同的数据类型,对于结构体,我们会用struct关键字来定义一个结构体
我们下面来看看一个简单的结构体如何创建:
比如我们要存储很多个学生的一些基本信息,我们可以这样创建:
struct student {char name[20];float height;int age;int score;
};
这就是一个简单的结构体
注:
①结构体里面的东西(就是用花括号括起来的)叫做结构体的成员变量,这些成员可以是不同的数据类型,比如整型,浮点型,字符型等等
②结构体就是一种你自己定义的一种新的数据类型,比如有的数据类型叫做int,float等,我们上面代码创建的就叫struct student
③结构体和常见的数据类型一样,我们可以通过int a ;来创建一个整型变量a,那么我们也可以通过struct student a,来创建一个结构体变量(前提是先创建好结构体!!)
④当然我们也可以在创建结构体的同时,就把变量创建好,像这样:
struct student {char name[20];float height;int age;int score;
}a; //注意这个结构体变量a的位置!
⑤使用该数据类型定义一个结构体变量,那么该结构体变量包含结构体里面的各个成员变量
⑥千万不要忘记结构体最后还有一个分号!!!!!!!!!!!!!!!!!!!!!!!
二、结构体名化简
上面提到,我们的struct + 一个东西,才是我们的类型名(比如上面的struct student),这个写起来十分麻烦,所以我们来介绍一个可以化简这个名字的好东西:
typedef化简大法
typedef可以为数据类型起一个新的名字
基本结构:
typedef 原类型名 新类型名;
我们来看一个例子:
typedef struct student {char name[20];float height;int age;int score;
}stu , *stup; //注意*的位置!!!!!!!1
在上面这个代码中,我们就使用了typedef来把之前的struct student变成了stu,而这个结构体指针就是*stup
注:
①两者之间用逗号分隔
②结构体指针:对于一个普通的数据类型比如int,我们有整形指针即int*,那么我们这个结构体同样有其结构体指针,即struct student*
③上述代码最后一行的*stup中的*,作用就是指明了stup这个就是一个指针,并且必须在stup前面,不能写成stup*
④前后对照
使用typedef前 | 使用typedef后 | |
结构体类型 | struct student | stu |
结构体指针 | struct student* | stup |
定义结构体变量a | struct student a | stu a |
定义结构体指针 | struct student* b | stup b |
⑤注意④中最后一行,stup已经是一个指针了,如果我们写stup*是一个二级指针,是错误的!
三、结构体的使用
结构体的创建和结构体的使用可以看成两部分,一个是我们用struct关键字来定义的部分,另一个就是在主函数int main()中使用创建的结构体
我们来看两个小示例:
①结构体变量访问结构体成员用"."
#include <stdio.h>typedef struct student {char name[20];float height;int age;int score;
}stu , *stup;int main() {stu a;printf("请输入你的姓名:");scanf_s("%s", a.name, sizeof(a.name)); //不用&,用scanf_s需要sizeof(a.name)a.height = 182.5;a.age = 20;a.score = 150; //结构体变量访问结构体成员用"."printf("%s , %f , %d , %d" , a.name , a.height , a.age , a.score);return 0;
}
输出:
②结构体指针访问结构体成员用"->"
#include <stdio.h>
#include <stdlib.h>typedef struct student {char name[20];float height;int age;int score;
}stu , *stup;int main() {stup b;b = (stup)malloc(sizeof(stu));printf("请输入你的姓名:");scanf_s("%s", b->name, sizeof(b->name)); //不用&b->height = 182.5;b->age = 20;b->score = 150; //结构体指针访问结构体成员用"->"printf("%s , %f , %d , %d" , b->name , b->height , b->age , b->score);free(b)return 0;
}
输出:
四、结构体的省略问题
当一个结构体内部包含本结构体的指针成员时,我们的原结构体名字不能省略,而且结构体指针成员也需要使用原结构体名
为什么:程序是自上而下运行的,如果结构体包含一个本结构体指针成员,当运行到指针的那一行代码时,这个结构体还没有运行完(也就是还没被定义完),计算机此时还不认识这个东西,同理,此时如果我们使用typedef,此时也没有完成typedef的操作,新名字还没命名完,计算机也不认识
以上就是C语言结构体的全部内容:)