【我们为什么要使用结构体?】
假如我们要设计一个员工管理系统,一共有100名员工,我们需要记录每一个员工的姓名,性别,职位,地址,电话号码等相关信息,如果我们逐一去申请变量,那么我们需要用到600个变量,显然不好操作;那我们如果定义数组,显然也是不可采取的,因为定义每一个员工中需要用到数据的类型都各不相同。那我们怎么办呢?
为了方便处理数据,结构体就是把一些相关的,类型不同的子项数据结合在一起,结构体实际上是一种自定义的数据类型,可以包含若干个数据类型相同或者不同的数据项。
简单的来说,结构体可以将多个单一的数据结合在一起,方便处理数据
【定义结构体】
1 2 3 4 5
| struct 结构体名 {
数据类型 结构体成员;
} 结构体变量名(可选);
|
来个例子吧!
1 2 3 4 5 6
| struct person_info{ char name[]; int age; char add[]; ... }Rual,Kobe;
|
结构体的成员可以是人员类型,也可以包括其他结构体
1 2 3 4 5 6 7 8 9
| struct person_infor { char name[]; int age; char job[]; char add[]; long int phone; struct date time; };
|
我们可以根据结构体来定义结构体变量:
1 2 3 4 5 6 7 8
| struct person_info{ char name[]; int age; char add[]; ... }; struct employee_infor Kobe; struct employee_infor Gasol;
|
注意:
1.我们在定义结构体与结构体变量时,struct一定不能丢,函数体必须在函数体外定义,也可以把结构体定义在头文件中,然后在程序中用#include包含。
2.定义结构体必须在函数体外,使用结构体的时候必须在函数体外。
来个例子吧!估计大家又听不懂了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include <stdio.h> struct pe_info//定义结构体 { char name[100]; int age; char add[100]; };
int main(void) {
struct pe_info Kobe={"Kobe",37,"Lakers"}; struct pe_info Gasol={"Gasol",35,"bull"};
printf("struct pe_for Kobe lst mem %s\n",Kobe.name); printf("struct pe_for Gasol lst mem %s\n",Gasol.name); return 0; }
|
运行结果:
如何访问结构体的成员?
形式:结构体变量名.成员
我们在初始化结构体变量的时候,也可以用typedef
,去简化结构体变量名。
我们来看一段代码:
我们用pinf
来简化struct pe_info
;与上面代码的效果是一样的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include <stdio.h> typedef struct pe_info//定义结构体 { char name[100]; int age; char add[100]; }pinf;
int main(void) {
pinf Kobe={"Kobe",37,"Lakers"}; pinf Gasol={"Gasol",35,"bull"};
printf("struct pe_for Kobe lst mem %s\n",Kobe.name); printf("struct pe_for Gasol lst mem %s\n",Gasol.name); return 0; }
|
运行结果:
我们再来个例子:给结构体赋值并输出结构体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <stdio.h> typedef struct pe_info//定义结构体 { char name[100]; int age; char add[100]; }pinf;
int main(void) {
pinf Kobe={"Kobe",37,"Lakers"}; pinf Gasol={"Gasol",35,"bull"};
printf("struct pe_for Kobe lst mem %s\n",Kobe.name); printf("struct pe_for Kobe 2st mem %d\n",Kobe.age); printf("struct pe_for Kobe 3st mem %s\n",Kobe.add); printf("\n"); printf("struct pe_for Gasol lst mem %s\n",Gasol.name); printf("struct pe_for Gasol 2st mem %d\n",Gasol.age); printf("struct pe_for Gasol 3st mem %s\n",Gasol.name); return 0; }
|
运行结果:
那么结构体在内存中是怎么处理的呢?
我们看下面的结构体:
1 2 3 4 5
| struct date_typ{ int a; char b; double c; }tt;
|
int a————4个字节
char b———1个字节
double c——16个字节
所以结构体总长度为4+1+16=21字节;
【结构体数组】
结构体数组和基本数组定义方法相同
先定义结构体,再声明结构体数组
1 2 3 4 5 6 7
| typedef struct pe_infor{ char name[SIZE]; int age; char team[SIZE]; }pe_info;
pe_info pers[30];
|
我们用结构体数组来写个程序:输入5个同学的学号,姓名和成绩:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include <stdio.h> typedef struct stu_info//定义结构体 { int id; char name[100]; int score; }s_inf;
int main(void) { s_inf stu[5]; for(int i=0;i<5;i++) { printf("input %d stu_name:",i+1); scanf("%s",&stu[i].name); printf("input %d stu_id:",i+1); scanf("%d",&stu[i].id); printf("input %d stu_score:",i+1); scanf("%d",&stu[i].score); printf("\n"); } return 0; }
|
运行结果:
【指向结构体的指针】
1 2 3 4 5 6 7 8
| typedef struct pe_infor{ char name[SIZE]; int age; char team[SIZE]; }pe_info;
pe_info *p; p=&pe_info;
|
结构体指针一般用->
符号来引用变量
1 2 3 4
| p->name;等价于(*p).name; p->age;等价于(*p).age; p->team;等价于(*p).team;
|