目录
1、结构的基础知识
2、结构成员的类型
3、结构体初始化
4、结构体的访问
5、结构体传参
1、结构的基础知识
结构是这些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量
数组:一组相同类型的元素的集合
结构体:也是一些值的集合,但是值的类型可以不同
注意以下几点;
(1)关键字struct是数据类型说明符,指出下面说的是结构体类型;
(2)标识符Student是结构体的类型名;
(3)最后的分号一定要写;
2、结构成员的类型
结构的成员可以是标量、数组、指针,甚至是其他结构体
注意:对结构体变量整体赋值有三种情况
(1)定义结构体变量(用{}初始化)
(2)用已定义的结构体变量初始化
(3)结构体类型相同的变量可以作为整体相互赋值;
struct Stu
{//结构体成员char name[20];int age;char id[20];
}s1,s2; //s1和s2也是结构体变量,他们是全局变量int main()
{struct Stu s; //在这里struct Stu是对象s的类型return 0;
}
3、结构体初始化
struct b
{char c;short s;double d;
};
struct Stu
{//结构体成员struct b sb;char name[20];int age;char id[20];
}s1,s2; //s1和s2也是结构体变量,他们是全局变量int main()
{struct Stu s = {{'c',20,3.14},"张三",21,20230105}; //在这里struct Stu是对象s的类型return 0;
}
4、结构体的访问
struct b
{char c;short s;double d;
};
struct Stu
{struct b sb;char name[20];int age;char id[30];
}s1,s2; int main()
{struct Stu s = {{'c',20,3.14},"张三",21, "20230105" };printf("%c\n",s.sb.c);printf("%c\n",s.id);struct Stu* ps = &s;//printf("%c\n", (*ps).sb.c);//printf("%c\n", ps -> sb.c);return 0;
}
5、结构体传参
//用两种方法:“ . ” 和“ -> ”
struct b
{char c;short s;double d;
};
struct Stu
{struct b sb;char name[20];int age;char id[30];
}s1,s2; void print1(struct Stu t)
{printf("%c %d %lf %s %d %s\n",t.sb.c,t.sb.s,t.sb.d,t.name,t.age,t.id);
}
void print2(struct Stu* pt)
{printf("%c %d %lf %s %d %s\n",pt->sb.c,pt->sb.s,pt->sb.d,pt->name,pt->age,pt->id);
}
int main()
{struct Stu s = {{'c',20,3.14},"张三",21,"20230105" };print1(s); //传值调用:实参传值到形参的时候,要额外开辟空间,浪费空间和时间print2(&s); //传址调用:光传过去的是4字节/8字节的地址,没有额外开销,所以这种方法效率更高一些return 0;
}
上面的 print1和print2 函数哪个好些 ?
答案是:首选print2函数。
原因:函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
结论:结构体传参的时候,要传结构体的地址。