一、结构体的声明
什么是结构体?
在c语言中存在各种类型的变量,但是这些类型只能单一的表示某一种类型,无法表示复杂的类型。
例如,遇到一个学生,不能简单的将其定义为char,int等类型,描述一个学生往往需要各种类型结合起来,比如用字符类型表示的名字,用整形类型表示的学号,用浮点数类型表示的成绩等等。
因此就需要自定义一个复杂类型,将其全部包含,所以就需要结构体来做到这件事情。
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
1.1 结构的声明、类型
struct tag
{
成员类型序列;
}变量序列;
当然也可以进行简化
利用typedef将结构体重新命名为一个简单的名字
这里的student就代表上面struct stu中所包含的所有信息。在进行运用时可以直接使用student
注意:分号不能丢失
结构体成员的类型可以是标量,数组,指针。甚至是其他结构体。
1.2 结构体变量的定义和初始化
结构体定义有两种:
(1)声明类型的同时定义变量p1
(2)定义结构体变量p2
结构体初始化:
定义变量后进行初始化
二、结构体成员的访问
2.1 点(.)操作符和箭头(->)操作符
点操作符只能用于结构体变量进行访问
箭头操作符则应用与结构体指针
2.2结构体变量的更改
注意:字符更改运用strcpy()库函数
三、结构体传参
struct stu
{
char name[20];
int ID;
int age;
float arr[10];//两门成绩
struct point s;//座位号
};
void print1(struct stu t)
{
printf("%s\n", t.name);//打印名字
printf("%d\n", t.ID);//打印学号
printf("%d\n", t.age);//打印年龄
printf("%f %f\n", t.arr[0], t.arr[1]);//打印成绩
printf("%d %d\n", t.s.x, t.s.y);//打印座位
}
void print2(struct stu * t)
{
printf("%s\n", t->name);//打印名字
printf("%d\n", t->ID);//打印学号
printf("%d\n", t->age);//打印年龄
printf("%f %f\n", t->arr[0], t->arr[1]);//打印成绩
printf("%d %d\n", t->s.x, t->s.y);//打印座位
}
int main()
{
struct stu t1 = { "李四",10086,20,{58.2,70.5},{1,2} };
print1(t1);//传值
print2(&t1);//传址
return 0;
}
在结构体进行传参时,如果采用的是传值,将会对其多一份临时拷贝,若结构体过大,参数压栈的的系统开销比较大,会导致性能的下降。
因此我们在传参的时候优先采用传地址,用地址去寻找结构体变量,便不会产生多余的临时拷贝。