本章重点:
- 结构体类型的声明
- 结构体初始化
- 结构体成员访问
- 结构体传参
1 结构体的声明
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
1.1 结构体的声明
1 2 3 4
| struct tag { member-list; }variable-list;
|
例如描述一个学生:
1 2 3 4 5 6 7
| struct Stu { char name[20]; int age; char sex[5]; char id[20]; };
|
可以将 struct Stu 重命名为Stu
1 2 3 4 5 6 7
| typedef struct Stu { char name[20]; int age; char sex[5]; char id[20]; }Stu;
|
结构的成员可以是标量、数组、指针,甚至是其他结构体。
1.2 结构体变量的定义和初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| struct Point { int x; int y; }p1;
struct Point p2;
struct Point p3 = {x, y};
struct Stu //类型声明 { char name[15]; int age; };
struct Stu s = {"zhangsan", 20};
struct Node { int data; struct Point p; struct Node* next; }n1 = {10, {4,5}, NULL};
struct Node n2 = {20, {5, 6}, NULL};
|
2 结构体成员的访问
2.1 结构体变量访问成员
1 2 3 4 5 6 7
| struct Stu { char name[20]; int age; }; struct S s = {"zhangsan",20}; printf("%s\n",s.name)
|
2.2 结构体指针访问指向变量的成员
1 2 3 4 5 6 7 8 9 10 11 12
| void print(struct Stu* ps) { printf("name = %s age = %d\n", (*ps).name, (*ps).age);
printf("name = %s age = %d\n", ps->name, ps->age); } int main() { struct Stu s = {"zhangsan", 20}; print(&s); return 0; }
|
3 结构体传参
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| struct S { int data[1000]; int num; };
struct S s = {{1,2,3,4}, 1000};
void print1(struct S s) { printf("%d\n", s.num); }
void print2(struct S* ps) { printf("%d\n", ps->num); }
int main() { print1(s); print2(&s); return 0; }
|
首选print2函数。因为,函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
结论:
结构体传参的时候,要传结构体的地址。