《c和指针》笔记9--结构
聚合数据类型能够同时存储超过一个的单独数据,C提供了两种类型的聚合数据类型,数组和结构。数组是相同类型的元素的集合,结构则是不同类型的元素的集合。
结构属于标量类型,因此可以像对待其他标量类型那样执行相同类型的操作。
结构声明如下:
struct tag { member-list } variable-list;
请看以下声明:
struct { int i; char c; float f; } x[20], *y;
以上声明创建了x和y两个变量,x是一个数组,包含20个结构,而y是一个指针,指向这个类型的指针。两个声明被编译器当作两种不同的类型,即使他们的成员列表相同。因此y = &x是非法的.
当需要使用一个结构的时候,都需要做如下的声明:
struct name variable;
在多个源文件中使用同一种类型的结构,就显得有些繁琐,因此可以使用typedef来简化声明结构。如:
typedef struct { int i; char c; float f; } Simple;
后续的声明如下这个样子:
Simple x; Simple x[20], *y;
这个技巧和声明一个结构标签效果几乎相同,但是Simple现在是个类型名而不是结构签名。
我们可以使用点操作符来访问成员,但是当拥有一个指向结构的指针时,则可是使用->来访问成员。
当我们将结构传递给函数的时候,会将结构拷贝一份传递给函数,这样的效率是很低的,我们可以声明一个指针,该指针指向的是该结构,然后指针传递给函数,这样效率会更好。
在许多机器中,我们也可以将参数声明为寄存器变量,从而进一步提高指针传递方案的效率。
假如我们并不希望函数对结构变量进行修改,我们仍然可以对变量使用const关键字来防止修改。
当你想在不同的时刻想把不同的东西存储于相同的位置时,就可以使用联合。联合的所有成员所引用的是内存中相同的位置。
当联合中的各个成员具有不同的长度时,联合的长度是最长成员的长度。
当我们对联合初始化的时候,如:
union { int i; char c; float f; } x = { 5 };
这个初始化始终是对第一个成员进行初始化,因此如果使用其他类型对其初始化,则编译器会将它转换并赋值给i,因此在初始化联合时,要注意类型。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述