C语言——结构体

简介: C语言——结构体

前言:每个人的人生中,可能都有那样一些话,如暗夜明灯、海上灯塔,给人以温暖和支撑、希望和力量。念起它们的时候,能感到一种被理解的妥帖,会生出一股被激励的能量,然后,我们得以在鼓舞中走得更远。让我们走进结构体

一.结构体

1.1 什么是结构体

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

1.2 结构体的声明

例如用结构体描述一个学生

1.3 特殊的声明

在声明结构体时,可以不完全声明,也就是匿名结构体类型

1.4 结构的自引用

结构的自引用就是自己作为自己的成员变量

但是要注意正确的引用方法

如果这样引用结构体的大小将会是无穷大

所以我们引入指针

这样才能达到自引用的目的

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

1.5.1 结构体变量的定义

1.5.2 结构体变量的初始化

1.5.3 结构体变量的嵌套初始化

1.6 结构体内存对齐

来计算一下结构体的大小

来计算一下结构体的大小如果不了解的话可能会觉得是

6 6 13

为什么最终结果会是这样呢?

这就要掌握首先得掌握结构体的对其原则

1.6.1结构体的对其原则

一.

二.结构体嵌套问题

为什么存在内存对齐?

大部分的参考资料都是如是说的:

  1. 平台原因(移植原因):
    不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
  2. 性能原因:
    数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
    原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

结构体的内存对齐是拿空间来换取时间的做法。

1.7 修改默认对齐数

结构在对齐方式不合适的时候,我么可以自己更改默认对齐数。

1.8 结构体传参

结构体传参有两种,传值调用和传址调用

两种方法都是可行的,但是也有区别

函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。

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

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


二.位段

2.1什么是位段

让我们来思考一下位段A的大小

我们来跟深入的了解一下位段的内存分配

2.2 位段的内存分配

  1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
  2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
  3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

2.3 位段的跨平台问题

  1. int 位段被当成有符号数还是无符号数是不确定的。
  2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。

所以跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。


三.感谢大家支持


目录
相关文章
|
23天前
|
存储 C语言
向函数传递结构体: C语言中的结构体参数传递详解
向函数传递结构体: C语言中的结构体参数传递详解
27 0
|
24天前
|
存储 编译器 Linux
C语言(12)----结构体
C语言(12)----结构体
27 1
|
6天前
|
算法 Java 程序员
面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性
【6月更文挑战第15天】面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性。封装可使用结构体封装数据和方法,如模拟矩形对象。继承则通过结构体嵌套实现静态继承。多态可通过函数指针模拟,但C不支持虚函数表,实现复杂。C语言能体现OOP思想,但不如C++、Java等语言原生支持。
26 7
|
7天前
|
编译器 C语言
【C语言基础】:自定义类型(一)--> 结构体-2
【C语言基础】:自定义类型(一)--> 结构体
|
7天前
|
编译器 Linux C语言
【C语言基础】:自定义类型(一)--> 结构体-1
【C语言基础】:自定义类型(一)--> 结构体
|
15天前
|
C语言
C语言学习记录——枚举(定义、与结构体的区别、优点)
C语言学习记录——枚举(定义、与结构体的区别、优点)
16 3
|
15天前
|
存储 编译器 C语言
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)一
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)一
21 2
|
15天前
|
编译器 Linux C语言
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)二
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)二
18 1
|
16天前
|
编译器 C语言
C语言深度理解之——结构体内存对齐
C语言深度理解之——结构体内存对齐
14 1
|
18天前
|
C语言
【初始C语言8】详细讲解初阶结构体的知识
【初始C语言8】详细讲解初阶结构体的知识