C语言之初识结构体

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

结构体类型的声明

结构体的声明

结构的基础知识:


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


现实生活中有很多的对象是复杂的,我们无法用简单的int类型、double类型、又或者是float类型来将其描述出来。这个时候我们就需要结构体了。

结构的声明

struct tag             //struct是结构体关键字,tag是结构体标签(可随意替换)
{
  member-list;       //成员列表
}variable-list;        //变量列表

倘若我们像描述一个人,人当然是一个非常复杂的对象了,所以我们来创造一个结构体来将其进行描述(比如名字、年龄、电话、性别):

1.png

下面我们换一种写法:

2.png

注意不要将这两个东西弄混:

3.png

第一张图中的Stu是一个类型,而第二张图中的s1,s2,s3是利用结构体类型直接创建的变量。

结构成员的类型

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

4.png

结构体初始化、结构成员访问以及结构体传参

我们有了结构体变量,那如何定义变量呢?请看:

5.png

下面看一个复杂点的:

5.png

倘若我们利用一个函数(结构体传参)来打印结构体,请看:

6.png


利用函数(结构体指针传参):

7.png

那么函数print1()和函数print2哪一种好呢?答案是函数print2(),为什么呢?请跟着我的思路来:

当我们创建结构体变量s时肯定是需要在内存中开辟一块空间的,这里结构体变量s是个实参,s这个对象当进行传参时,倘若采用函数print1()的方式,由于tmp是形参,当实参传给形参时,形参是实参的一份临时拷贝,此时我们必须再次拷贝出一份和它一模一样大小的数据放在内存中其它的位置叫tmp,此时内存中就有了两块内存空间,一块是实参s的空间,另一块就是形参tmp的空间。这样不仅仅是空间浪费严重,而且当我们把s里面的数据全部拷贝到tmp中去时,时间浪费也特别严重

而当我们采用函数print2()的方式时,ps是一个指针,故此时传过去的是一个地址。而一个地址无非是4或8个字节,无论这个结构体多大,我只传4或者8个字节,这样传参过去之后只需要创建一个结构体指针变量ps就行,再通过这个指针进行相关数据的打印即可。

所以说啊,首选函数print2()的原因:函数传参的时候,参数也是需要压栈的,如果传递一个结构体对象的时候,结构体过大,函数压栈的系统开销比较大,所以会导致性能的下降。

结论:在未来,如果允许的情况下,进行结构体传参时要传结构体的地址。

目录
相关文章
|
2月前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
194 14
|
2月前
|
存储 编译器 C语言
【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
结构体通过`struct`关键字定义。定义结构体时,需要指定结构体的名称以及结构体内部的成员变量。
208 10
|
3月前
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
3月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
268 13
|
3月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
111 11
|
3月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
81 4
|
4月前
|
存储 C语言
如何在 C 语言中实现结构体的深拷贝
在C语言中实现结构体的深拷贝,需要手动分配内存并逐个复制成员变量,确保新结构体与原结构体完全独立,避免浅拷贝导致的数据共享问题。具体方法包括使用 `malloc` 分配内存和 `memcpy` 或手动赋值。
121 10
|
4月前
|
存储 大数据 编译器
C语言:结构体对齐规则
C语言中,结构体对齐规则是指编译器为了提高数据访问效率,会根据成员变量的类型对结构体中的成员进行内存对齐。通常遵循编译器默认的对齐方式或使用特定的对齐指令来优化结构体布局,以减少内存浪费并提升性能。
|
4月前
|
编译器 C语言
共用体和结构体在 C 语言中的优先级是怎样的
在C语言中,共用体(union)和结构体(struct)的优先级相同,它们都是用户自定义的数据类型,用于组合不同类型的数据。但是,共用体中的所有成员共享同一段内存,而结构体中的成员各自占用独立的内存空间。
|
4月前
|
编译器 C语言 C++
C语言结构体
C语言结构体
40 5