C语言-数据结构-结构体
一、结构体的定义
数组(Array)是一组具有相同类型的数据的集合。但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。
结构体(Struct)可以来存放一组不同类型的数据。其是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。
结构体的定义形式为:
struct 结构体名{ 结构体所包含的变量或数组 };
例如:
struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 };
定义结构体变量:
struct stu stu1,stu2;
或者在定义结构体的同时定义变量:
struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 }stu1,stu2;
常用的是利用typedef为struct stu取别名:
typedef struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 }student;
student stu1, stu2;
给结构体变量赋值:
stu1.name = "Tom"; stu1.num = 12; stu1.age = 18; stu1.group = 'A'; stu1.score = 136.5;
二、结构体数组的定义
//赋值
struct stu stu1[5]; //或student stu1[5];
//赋值 class[5] = { {"Li ping", 5, 18, 'C', 145.0}, {"Zhang ping", 4, 19, 'A', 130.5}, {"He fang", 1, 18, 'A', 148.5}, {"Cheng ling", 2, 17, 'F', 139.0}, {"Wang ming", 3, 17, 'B', 144.5} }
结构体数组的使用,例如,
获取 Wang ming 的成绩:stu1[4].score;
修改 Li ping 的学习小组:class[0].group = 'B';
三、结构体指针
当一个指针变量指向结构体时,我们就称它为结构体指针。C语言结构体指针的定义形式一般为:
struct 结构体名 *变量名;
注意,结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&
,所以给 pstu 赋值只能写作:
struct stu *pstu = &stu1;
获取结构体成员:.
的优先级高于*
,(*pointer)
两边的括号不能少。
(*pointer).memberName
或:->
是一个新的运算符,可以通过结构体指针直接取得结构体成员;
pointer->memberName
结构体指针作为函数参数:
结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。如果结构体成员较多,尤其是成员为数组时,传送的时间和空间开销会很大,影响程序的运行效率。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址,非常快速。
注意:结构体数组指针的使用(结构体数组变量名前不需要加&)
#include <stdio.h> struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩 }stus[] = { {"Zhou ping", 5, 18, 'C', 145.0}, {"Zhang ping", 4, 19, 'A', 130.5}, {"Liu fang", 1, 18, 'A', 148.5}, {"Cheng ling", 2, 17, 'F', 139.0}, {"Wang ming", 3, 17, 'B', 144.5} }, *ps; int main(){ //求数组长度 int len = sizeof(stus) / sizeof(struct stu); printf("Name\t\tNum\tAge\tGroup\tScore\t\n"); for(ps=stus; ps<stus+len; ps++){ printf("%s\t%d\t%d\t%c\t%.1f\n", ps->name, ps->num, ps->age, ps->group, ps->score); } return 0; }