深圳幻海软件技术有限公司 欢迎您!

我能“C”——初阶结构体

2023-04-19

目录结构体1.结构体的声明1.1结构体的基础知识1.2结构体的声明1.3结构成员的类型1.4结构体变量的定义和初始化2.结构体成员的访问3.结构体传参 THEEND结构体结构体类型的声明结构体初始化结构体成员访问结构体传参1.结构体的声明1.1结构体的基础知识结构是一些的集合,这些值称为成

目录

结构体

1.结构体的声明

1.1结构体的基础知识

1.2结构体的声明

1.3结构成员的类型

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

2. 结构体成员的访问

3.结构体传参 

THE END


结构体

  • 结构体类型的声明
  • 结构体初始化
  • 结构体成员访问
  • 结构体传参

1.结构体的声明

1.1结构体的基础知识

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

1.2结构体的声明

struct tag
{
member - list ;
} variable - list ;
  1. //例如描述一个学生
  2. typedef struct Stu
  3. {
  4. char name[20];//名字
  5. int age;//年龄
  6. char sex[5];//性别
  7. char id[20];//学号
  8. }Stu;//分号不能丢

 

 用关键字创建typedef

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.结构体变量访问成员 结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。

2.结构体指针访问指向变量的成员有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。结构体指针->结构体成员

  1. #include <stdio.h>
  2. struct Book
  3. {
  4. char name[20];
  5. int price;
  6. };
  7. void print(struct Book* p)
  8. {
  9. printf("%s %d\n", p->name, p->price);
  10. }
  11. int main()
  12. {
  13. struct Book b1 = {"C语言", 66};
  14. struct Book b2 = { .price = 80, .name = "数据结构"};//初始化成员变量可以不按照声明的顺序
  15. //结构体变量.结构体成员
  16. printf("%s %d\n", b1.name, b1.price);
  17. printf("%s %d\n", b2.name, b2.price);
  18. //结构体指针->结构体成员
  19. struct Book* p1 = &b1;
  20. print(&b1);
  21. return 0;
  22. }

3.结构体传参 

结构体传参是怎么传的呢?其实也有两种传法,一是传值调用,二是传址调用。

  1. #include <stdio.h>
  2. struct S
  3. {
  4. int arr[100];
  5. int n;
  6. };
  7. void print1(struct S ss)
  8. {
  9. int i = 0;
  10. for (i = 0; i < 10; i++)
  11. {
  12. printf("%d ", ss.arr[i]);
  13. }
  14. printf("\n%d\n", ss.n);
  15. }
  16. void print2(struct S* ps)
  17. {
  18. int i = 0;
  19. for (i = 0; i < 10; i++)
  20. {
  21. printf("%d ", ps->arr[i]);
  22. }
  23. printf("\n%d\n", ps->n);
  24. }
  25. int main()
  26. {
  27. struct S s = { {1,2,3,4,5}, 100 };
  28. print1(s);
  29. print2(&s);
  30. return 0;

因为函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降因此,选择传址调用方法才是最优的选择。

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

THE END

        这是今日份关于结构体的一些分享,希望可以帮助到大家!如果有什么不足的地方也请家人们给小叶一些好的建议,我会不断优化文章的!那就让我们一起加油吧!哈哈哈哈哈

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览44435 人正在系统学习中