【C生万物】 结构体篇

简介: 【C生万物】 结构体篇

目录


Part1:结构体的声明

1.概念

2.声明和定义

3.变量初始化

Part2:结构体成员访问

1.结构体变量访问成员

2.结构体指针访问成员

Part3:结构体传参


前言


这期继续C语言的学习,进行结构体的讲解,值得注意的是,这期的结构体只是简单的介绍和使用,后期会再次详细讲解。


正文


Part1:结构体的声明


1.概念


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


2.声明和定义


一图就懂:

513cb67821b57f14a877c65420ab0ea1_9445cd184aa3494f9f7faa8750e042df.png

如:

e35b09336280f5f01a25f7aba52f839a_ecb4e536deff432e9775fa9232da1f1d.png

声明一个学生结构体,其中包括学生的姓名 name ,年龄 age ,性别 sex

同时定义了两个该类型的结构体变量:s1 , s2.

当然先声明后定义也可以:

5f5578733836ebc49e3a8425faa43f84_af2976b25cfc4684962b7a3216361ea2.png

为了方便,还可以这样玩:

aeaa94216d405c225437ac67dfc0f6ca_46b610a737dc40dbb997e4b4b6283f25.png


3.变量初始化


初始化就是给结构体成员附一些初始值

继学生结构体:

ecf703d9307d9587b28ed07137b37358_55eca444b3ec456798563fcfb8ea033e.png

初始化:

Stu s1 = { "claffic",18,"boy" };


注意:初始化内容一定按顺序与类型匹配

那结构体里有结构体怎么办?

嵌套初始化即可:

typedef struct Point
{
  int x;
  int y;
};
struct Node
{
  int data;
  struct Point p;
  struct Node* next;
}n1 = { 10,{1,3},NULL };
struct Node n2 = { 20,{2,4},NULL };


Part2:结构体成员访问


1.结构体变量访问成员


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

0e7de588df1fce7a11e4748ed3c7029c_a796052465d64ae18e70a01063fa3cce.png

struct student s;
strcpy(s.name, "claffic"); // 字符串不可直接用 = 赋值
strcpy(s.sex, "boy");


2.结构体指针访问成员


有时我们得到的不是结构体变量,而是结构体指针,也可以访问结构体变量。

struct student
{
  char name[20];
  int age;
  char sex[5];
};
void Print(struct student* ps) // 传递指针
{
    // 解引用访问
  printf("name = %s  age = %d  sex = %s", (*ps).name, (*ps).age, (*ps).sex);
    // 指针访问 用 -> 操作符
  printf("name = %s  age = %d  sex = %s", ps->name, ps->age, ps->sex);
}
int main()
{
  struct student s = { "claffic",18,"boy" };
  Print(&s); // 传递地址,取地址
  return 0;
}


运行结果:

5ed55d841e92e1f791bb7e0f52c03237_3262fd781502466291992f76abf55467.png


Part3:结构体传参


传参与成员的访问大差不差

也是有两种类型:结构体变量传参 结构体指针传参

我们接下来对比一下两种方法:

struct S
{
  int data[1000];
  int num;
};
struct S s = { {1,2,3,4}, 500 };
//结构体传参
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;
}


以上方式展示了两种传参的方式,

试想一下, Print1 Print2 哪个好?

首选 Print2

原因:

函数传参的时候,参数是需要压栈的。

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

而指针的大小是固定不变的,开销稳定。

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


总结:

这就是结构体的初级知识介绍了,整体上不算复杂,会定义和使用结构体即可。


码文不易

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗



目录
相关文章
|
8月前
|
存储 分布式计算 监控
阿里云服务器实例经济型e、通用算力型u1、计算型c8i、通用型g8i、内存型r8i详解与选择策略
在阿里云现在的活动中,可选的云服务器实例规格主要有经济型e、通用算力型u1、计算型c8i、通用型g8i、内存型r8i实例,虽然阿里云在活动中提供了多种不同规格的云服务器实例,以满足不同用户和应用场景的需求。但是有的用户并不清楚他们的性能如何,应该如何选择。本文将详细介绍阿里云服务器中的经济型e、通用算力型u1、计算型c8i、通用型g8i、内存型r8i实例的性能、适用场景及选择参考,帮助用户根据自身需求做出更加精准的选择。
|
存储 Kubernetes Cloud Native
带你读《存储漫谈Ceph原理与实践》第一章分布式存储概述1.3Ceph 的发展历程
《存储漫谈Ceph原理与实践》第一章分布式存储概述1.3Ceph 的发展历程
|
6月前
|
人工智能 编解码 芯片
告别低效沟通|让技术提问不再头疼-这套高效AI提问模板来帮你
不会向ai提问,不知道怎么提问的 可以看看
20645 1
告别低效沟通|让技术提问不再头疼-这套高效AI提问模板来帮你
|
9月前
|
人工智能 自然语言处理 算法
垂直领域大模型必须备案吗?90%企业都搞错的大模型备案真相!
珠宝设计师专用的大模型是否需要备案?本文解析大模型备案与算法备案的区别及法规边界。大模型备案针对公众服务,仅面向专业设计师可暂缓;但算法备案必须完成。涉及深度合成类算法的企业需在30日内备案。合规不仅是义务,更是提升企业竞争力的关键。
|
JavaScript 算法 UED
虚拟 DOM 是如何避免频繁重绘的?
虚拟 DOM 通过构建虚拟 DOM 树、比较差异、批量更新、精确更新、异步更新以及局部渲染优化等多种机制,有效地避免了频繁重绘,提高了页面的渲染性能和用户体验。这些机制相互配合,使得虚拟 DOM 在处理复杂的页面更新时能够更加高效和智能,减少不必要的性能开销。
246 58
|
机器学习/深度学习 人工智能 自然语言处理
智能语音助手的技术演进与未来趋势####
【10月更文挑战第16天】 智能语音助手,作为人工智能领域的璀璨明珠,正以前所未有的速度融入我们的生活。本文旨在探索这一技术奇迹背后的奥秘,从最初的简单命令响应,到如今能够理解复杂语境、提供个性化服务的高阶智能体,智能语音助手的发展历程见证了技术进步的非凡成就。我们将深入剖析其核心技术原理,包括自然语言处理(NLP)、语音识别与合成、深度学习等,同时展望未来,探讨在物联网、医疗健康、教育等多个领域潜在的革命性应用。这不仅是一篇技术解读,更是对智能时代生活方式变革的一次深刻洞察。 ####
769 6
|
缓存 运维 关系型数据库
PolarDB产品使用问题之如何进行PolarDBX的本地部署
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
存储 JSON 算法
JWT的原理及实际应用
JWT的原理及实际应用
406 1
|
JSON API 开发者
微店(Weidian)商品详情API接口解析实战
微店(Weidian)是一个基于社交关系的电商平台,为商家提供了一整套的电商解决方案。微店API接口允许开发者通过编程方式访问和操作微店平台上的数据,从而可以创建自动化的工具、应用或集成服务。
|
机器学习/深度学习 搜索推荐 API
实时数据获取:抖音API在电商中的应用与影响
在电商行业高速发展的今天,数据已经成为企业决策和创新的重要驱动力。抖音作为全球最大的短视频平台之一,其根据关键词取商品列表API为电商行业带来了前所未有的机遇和挑战。本文将深入探讨该API在电商行业中的关键作用,以及如何实现实时数据获取,为电商企业提供有价值的见解。