史上最强C语言教程----结构体(初阶)

x33g5p2x  于2022-01-04 转载在 其他  
字(1.6k)|赞(0)|评价(0)|浏览(294)
  1. 结构体的声明

1.1 什么是结构体

1.2 结构体的声明

1.3 结构成员的类型

1.4 结构体变量的定义和初始化

  1. 结构体成员的访问

  2. 结构体传参

1. 结构体的声明

1.1 什么是结构体

  • 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

1.2 结构体的声明

  1. struct tag
  2. {
  3. member - list;
  4. }variable - list;

例如描述一个学生:

  1. typedef struct Stu
  2. {
  3. char name[20];//名字
  4. int age;//年龄
  5. char sex[5];//性别
  6. char id[20];//学号
  7. }Stu//分号不能丢

1.3 结构成员的类型

结构的成员可以是标量、数组、指针,甚至是其他结构体。

1.4 结构体变量的定义和初始化

有了结构体类型,那如何定义变量,其实很简单。

  1. struct Point
  2. {
  3. int x;
  4. int y;
  5. }p1; //声明类型的同时定义变量p1
  6. struct Point p2; //定义结构体变量p2
  7. //初始化:定义变量的同时赋初值。
  8. struct Point p3 = { x, y };
  9. struct Stu //类型声明
  10. {
  11. char name[15];//名字
  12. int age; //年龄
  13. };
  14. struct Stu s = { "zhangsan", 20 };//初始化
  15. struct Node
  16. {
  17. int data;
  18. struct Point p;
  19. struct Node* next;
  20. }n1 = { 10, {4,5}, NULL }; //结构体嵌套初始化
  21. struct Node n2 = { 20, {5, 6}, NULL };//结构体嵌套初始化

2. 结构体成员的访问

  • 结构体变量访问成员

结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。 例如:

  1. struct Stu
  2. {
  3. char name[20];
  4. int age;
  5. };
  6. struct Stu s;

我们可以看到 s 有成员 name 和 age 

那我们如何访问s的成员?

  1. struct S s;
  2. strcpy(s.name, "zhangsan");//使用.访问name成员
  3. s.age = 20;//使用.访问age成员
  •  结构体指针访问指向变量的成员

有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。

那该如何访问成员。 如下:

  1. struct Stu
  2. {
  3. char name[20];
  4. int age;
  5. };
  6. void print(struct Stu* ps)
  7. {
  8. printf("name = %s age = %d\n", (*ps).name, (*ps).age);
  9. //使用结构体指针访问指向对象的成员
  10. printf("name = %s age = %d\n", ps->name, ps->age);
  11. }
  12. int main()
  13. {
  14. struct Stu s = { "zhangsan", 20 };
  15. print(&s);//结构体地址传参
  16. return 0;
  17. }

3. 结构体传参

直接上代码:

  1. struct S
  2. {
  3. int data[1000];
  4. int num;
  5. };
  6. struct S s = { {1,2,3,4}, 1000 };
  7. //结构体传参
  8. void print1(struct S s)
  9. {
  10. printf("%d\n", s.num);
  11. }
  12. //结构体地址传参
  13. void print2(struct S* ps)
  14. {
  15. printf("%d\n", ps->num);
  16. }
  17. int main()
  18. {
  19. print1(s); //传结构体
  20. print2(&s); //传地址
  21. return 0;
  22. }

上面的 print1 和 print2 函数哪个好些?

答案是:首选print2函数。

原因:

  • 函数传参的时候,参数是需要压栈的。
  • 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的 下降。

结论:

结构体传参的时候,要传结构体的地址。

相关文章