目录
1.结构体类型的声明
1.1 结构体的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
数组:一组相同类型元素的集合
结构体:一些值的集合,值的类型可以不同
1.2 结构的声明
struct Stu
{
//成员变量
char name[20];
int age;
char id[20];
}s1,s2;
//全局变量
int main()
{
//局部变量
struct Stu s;//对象
return 0;
}
1.3 结构成员的类型
结构的成员可以是标量、数组、指针,甚至是其他结构体。
struct Stu1
{
char a;
short b;
double c;
};
struct Stu
{
//成员变量
struct Stu1 stu1;
char name[20];
int age;
char id[20];
};
1.4 结构体变量的定义和初始化
struct Stu s = { { 'xcm',9,7},"z",21,"20220907"};
2.结构体成员的访问
struct Stu1
{
char a;
short b;
double c;
};
struct Stu
{
//成员变量
struct Stu1 stu1;
char name[20];
int age;
char id[20];
};
int main()
{
//局部变量
struct Stu s = { { 'z',9,7},"xcm",21,"20220907"};//对象
//结构体成员的访问 . ->
printf("%c ", s.stu1.a);
printf("%s\n", s.id);
struct Stu* ps = &s;
printf("%c ", (*ps).stu1.a);
printf("%s\n", (*ps).id);
printf("%c ", ps->stu1.a);
printf("%s", ps->id);
return 0;
}
3.结构体传参
void print1(struct Stu t)
{
printf("%c %d %.2lf %s %d %s\n", t.stu1.a, t.stu1.b, t.stu1.c, t.name, t.age, t.id);
}
void print2(struct Stu* ps)
{
printf("%c %d %.2lf %s %d %s", ps->stu1.a, ps->stu1.b, ps->stu1.c, ps->name, ps->age, ps->id);
}
int main()
{
//局部变量
struct Stu s = { { 'z',9,7},"xcm",21,"20220907"};//对象
print1(s);//传值调用
print2(&s);//传址调用
return 0;
}
输出:z 9 7.00 xcm 21 20220907
z 9 7.00 xcm 21 20220907
上面的
print1
和
print2
函数哪个好些?
当然是首选print2啦。这是因为函数传参的时候,参数是需要压栈的(给栈中存放数据),如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降而且print1()函数无法改变对象的值,仅仅是对值进行了一份拷贝。
结论: 结构体传参的时候,要传结构体的地址