结构体的声明
结构是一些值的集合,这些值被称为成员变量。结构的每个成员可以是不同类型的变量。
结构成员的类型可以是标量、数组、指针、甚至是其他结构体
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也是结构体变量 //s1、s2是全局变量 int main() { //s是局部变量 struct Stu s = { { 'a', 20 , 3.14}, "张三", 18, "1212213213"};//对象 return 0; }
结构体成员访问
struct B { char c; short s; double d; }; struct Stu { struct B sb; char name[20]; int age; char id[20]; }; int main() { //s是局部变量 struct Stu s = { { 'a', 20 , 3.14}, "张三", 18, "1212213213"};//对象 // . -> printf("%c\n\n", s.sb.c); struct Stu* ps = &s; printf("%c\n", (*ps).sb.c); printf("%c\n", ps->sb.c); return 0; }
结构体传参
struct B { char c; short s; double d; }; struct Stu { struct B sb; char name[20]; int age; char id[20]; }; 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* ps) { printf("%c %d %lf %s %d %s\n", ps->sb.c, ps->sb.s, ps->sb.d, ps->name, ps->age, ps->id); } int main() { struct Stu s = { { 'a', 20 , 3.14}, "张三", 18, "1212213213" }; print1(s);//传值调用 print2(&s);//传址调用 return 0; }
函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
栈是一种数据结构,特点是先进的后出,后进的先出;
给栈中存放数据的操作叫压栈,删除栈中数据的操作叫出栈;
每个函数调用都会在内存的栈区上开辟一块空间。
所以我我们在给结构体传参的时候要尽量传地址。