初阶结构体

简介: 初阶结构体

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 个字节传过去即可。

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

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

下降

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

相关文章
|
3天前
|
数据采集 人工智能 安全
|
12天前
|
云安全 监控 安全
|
4天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1063 151
|
4天前
|
编解码 人工智能 机器人
通义万相2.6,模型使用指南
智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话
|
17天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1739 9
|
9天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
685 152
|
11天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
653 12
|
6天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
413 4