一、结构体的声明
结构体(类型)是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
比如说一本书,它包含书名、书号、出版社、价格等,我们用一种数据类型去描述并不能完整地描述出来,这时候就需要用到结构体声明了。
1.1结构的声明
语法格式:struct tag (结构体名称)
{
member-list;(成员列表)
}variable-list;(变量列表,全局变量)
在结构体声明的{}后面创建的变量是全局变量,如果我们只想创建局部变量,就在mian函数里创建。
如果我们每次在main函数中创建变量都要写Struct Book,感觉很麻烦,可不可以直接写Book加变量名呢?,我们可以在声明struct Book之前加一个typedef,在结构体声明的{}后面加上Book,对其进行重命名。(此时,后面就不能直接添加全局变量了)
1.2结构体变量的定义和初始化
变量定义:创建了结构体类型,那么就可以直接定义变量。
struct Point { int x; int y; }p1; //声明类型的同时定义变量p1 struct Point p2; //定义结构体变量p2
初始化:定义变量的同时并赋值
将代码打印:
二、结构体成员的访问
2.1结构体变量访问成员
结构体变量的成员是通过点操作符(.)访问的。 格式:结构体变量名.成员变量
直接上代码:
typedef struct Student { char name[20]; int age; }stu; stu s = { "张三",18 }; int main() { printf("%s", s.name); s.age = 20; return 0; }
2.2结构体指针访问指向变量的成员
- (*结构体成员名). 成员变量
- 结构体成员名->成员变量
typedef struct Student { char name[20]; int age; }stu; stu s = { "张三",18 }; void print(stu* s) { printf("%s %d\n", (*s).name, (*s).age); printf("%s %d\n", s->name, s->age); } int main() { print(&s); return 0; }
三、结构体传参
直接上代码
struct S { int arr[100]; int num; }; struct S s = { {1,2,3,4}, 1000 }; //结构体传参 void print1(struct S s) { int i = 0; for (i = 0; i < 10; i++) { printf("%d ", s.arr[i]); } printf("\n%d\n", s.num); } //结构体地址传参 void print2(struct S* ps) { int i = 0; for (i = 0; i < 10; i++) { printf("%d ", ps->arr[i]); } printf("\n%d\n", ps->num); } int main() { print1(s); //传结构体 print2(&s); //传地址 return 0; }
那么以上print1和print2函数哪个更优化呢?答案当然是print2
原因:函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
结论:所以,我们在函数给结构体传参的时候,尽量考虑传递结构体的地址。