初阶结构体

简介: 初阶结构体

1 结构体的声明

1.1 结构的基础知识

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

(数组是一组相同类型元素的集合)因为生活中的对象都是复杂的,比如:一个人:姓名+年龄+性别+电话 才能描述。(结构体就是用来描述复杂对象的)

1.2 结构的声明

1. struct stu    //struct 是结构体关键字,stu(这个是自己定义的,student的前三个字母)
2. {//学生:姓名+年龄+分数
3.  char name[20];//姓名是字符类型,
4.  int age;//年龄 
5.  float score;//分数
6. };

1.3 结构成员的类型

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

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

1.4.1 结构体类型的局部定义

定义一个局部的结构体变量,代码展示:

1. struct stu    //struct 是结构体关键字,stu(这个是自己定义的,student的前三个字母)
2. {//学生:姓名+年龄+分数
3.  char name[20];//姓名是字符类型,
4.  int age;//年龄 
5.  float score;//分数
6. };
7. int main()
8. {
9.  struct stu s;//s就是结构体变量,struct stu 就是和int char float 一样的类型
10.   return 0;
11. }

1.4.2 结构体类型的全局定义

定义一个全局的结构体变量,代码展示:

1. struct stu    //struct 是结构体关键字,stu(这个是自己定义的,student的前三个字母)
2. {//学生:姓名+年龄+分数
3.  char name[20];//姓名是字符类型,
4.  int age;//年龄 
5.  float score;//分数
6. }s1, s2;//这里的s1 s2 和s一样,也是结构体变量,(全局的)
7. int main()
8. {
9.  struct stu s;//s就是结构体变量,struct stu 就是和int char float 一样的类型,但是却是局部的
10.   return 0;
11. }

注意:

结构体变量,那个分号不能丢。

1.4.3 结构体类型的初始化

代码展示:

1. struct stu    
2. {
3.  char name[20];
4.  int age;
5.  float score;
6. };
7. int main()
8. {
9.  struct stu s = { "xiaoming", 20, 97.5f };//97.5 后面加f说明是float类型,不加的话,会默认为为double类型
10.   printf("%s %d %f", s.name, s.age, s.score);
11.   return 0;
12. }

97.5 后面加f说明是float类型,不加的话,系统会默认为为double类型

1.4.4 结构体类型嵌套初始化

代码展示:

1. #include <stdio.h>
2. struct S
3. {
4.  int a;
5.  char b;
6.  double c;
7. };
8. struct stu
9. {
10.   struct S ss;
11.   char name[20];
12.   int age;
13.   float score;
14. };
15. int main()
16. {
17.   struct stu s = { { 20, 's', 3.14 },"xiaoming", 20, 97.5f };
18.   printf("%d %c %lf %s %d %f", s.ss.a, s.ss.b,s.ss.c,s.name, s.age, s.score);
19.   return 0;
20. }
1. struct Node
2. {
3. int data;
4. struct Point p;
5. struct Node* next;
6. }n1 = {10, {4,5}, NULL};

2 结构体成员的访问

(1) 结构体变量访问成员

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

(2)结构体指针访问指向变量的成员

3 结构体传参

代码展示:(结构体传参)

1. #include <stdio.h>
2. struct mn
3. {
4.  int arr[1000];
5.  int a;
6.  char ch[100];
7. };
8. void print(struct mn n)
9. {
10.   int i = 0;
11.   for (i = 0; i < 10; i++)
12.   {
13.     printf("%d ", n.arr[i]);
14.   }
15.   printf("\n");
16.   printf("%d\n", n.a);
17.   printf("%s\n", n.ch);
18. }
19. int main()
20. {
21.   struct mn s = { { 1,2,3,4,5,6,7,8,9,10 }, 8, "abcdefg" };
22.   print(s);
23.   return 0;
24. }

代码展示:(结构体地址传参)

1. #include <stdio.h>
2. struct mn
3. {
4.  int arr[1000];
5.  int a;
6.  char ch[100];
7. };
8. 
9. void print(struct mn* n)
10. {
11.   int i = 0;
12.   for (i = 0; i < 10; i++)
13.   {
14.     printf("%d ", n->arr[i]);
15.   }
16.   printf("\n");
17.   printf("%d\n", n->a);
18.   printf("%s\n", n->ch);
19. }
20. 
21. int main()
22. {
23.   struct mn s = { { 1,2,3,4,5,6,7,8,9,10 }, 8, "abcdefg" };
24.   print(&s);
25.   return 0;
26. }

结构体传参,形参是实参的一份临时拷贝。所以会浪费大量的内存。但是结构体传地址,仅仅把4个字节或者8 个字节传过去即可。

所以我们最佳选择是 结构体传址。原因是:函数传参的时候,参数是需要压栈的。

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

下降

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

相关文章
|
11天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1244 5
|
10天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1230 87
|
11天前
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
1804 13
|
20天前
|
人工智能 运维 安全
|
4天前
|
资源调度
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
236 127
|
4天前
|
前端开发
Promise的then方法返回的新Promise对象有什么特点?
Promise的then方法返回的新Promise对象有什么特点?
182 2