目录
一.结构体的声明:
结构体的定义如下所示,struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。
struct tag {
member-list
} variable-list ; //这个;不能少
在结构体中,必须有struct tag和member-list是必须要有的,而variable-list是可以没有的,variable-list只是一个结构体变量,而且是全局变量,这里可以不写也行。
struct tag {
member-list
} ;
二.结构体成员的类型:
结构体成员可以是标量,数组,指针,甚至是其他结构体。
当我们想定义一个人时,我们可能会想到他的身高,体重,名字等
身高我们就用float来定义,体重用int,名字用char
struct people
{
int weight;//体重
char name[20];//数组来存名字
float height;//身高
};
三.结构体变量的定义和初始化:
struct people
{
int weight;//体重
char name[20];//名字
float height;//身高
};
int main()
{
struct people man = { 55,"小陈",172 };//man就是结构体变量,是局部变量
struct people max = { .weight = 55,.name = "小陈",.height = 172 };
//这两种结构体的初始化都可以
return 0;
}
typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,它与宏定义有些差异。它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。
这里我们写struct people感觉有点麻烦,我们就可以使用typedef来给结构体定义一个简单的别名,之后我们就可以使用别名来代替结构体类型。上述初始化代码我们就可以这样写。
typedef struct people M;
struct people//这里不能用M来代替
{
int weight;//体重
char name[20];//名字
float height;//身高
};
int main()
{
M man = { 55,"小陈",172 };
//这里就是用M来代替struct people
M max = { .weight = 55,.name = "小陈",.height = 172 };
//这两种结构体的初始化都可以
return 0;
}
当结构体的成员有结构体,我们又该如何对结构体初始化呢?
struct book
{
char name[20];
struct people;
int price;
};
struct people
{
int weight;
char name[10];
float height;
};
int main()
{
struct book b1 = { "活着",{60,"富贵",170},50 };//用大括号括起来
//从结构体book里面从上往下初始化结构体成员
return 0;
}
四.结构体成员的访问:
对结构体成员的访问有两种形式:之前我们在操作符详解已经学习过了
1.结构体变量.结构体成员名
2.结构体指针->结构体成员名
struct people
{
int weight;
char name[10];
float height;
};
void print(struct people* b2)
{
printf("%d %s %f\n", b2->weight, b2->name, b2->height);
}
int main()
{
struct people b1 = { 55,"小陈",172};
printf("%d %s %f\n", b1.weight, b1.name, b1.height);
print(&b1);
return 0;
}
五.结构体传参:
结构体传参也有两种,一种是传结构体变量过去,还有一种就是传地址过去,这两者有什么区别吗?
struct people
{
int weight;
char name[10];
float height;
};
void print1(struct people* b2)
{
printf("%d %s %.1f\n", b2->weight, b2->name, b2->height);
}
void print2(struct people b2)//形参
{
printf("%d %s %.1f\n", b2.weight, b2.name, b2.height);
}
int main()
{
struct people b1 = { 55,"小陈",172};
printf("%d %s %.1f\n", b1.weight, b1.name, b1.height);
print1(&b1);//传地址
print2(b1);//传变量,实参
return 0;
}
当我们传参的时候,如果传的结构体变量,那形参就要开辟结构体成员内存的总空间来接收实参,因为函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。
所以我们尽量使用传地址的形式,也就是传指针,因为我们知道指针大小就是4或者8个字节。
所以这样就比较节省空间。
结论:结构体传参的时候,要传结构体的地址。
各位老铁这就是全部的内容。感谢支持!