19.(C进阶)结构体(全)

简介: 19.(C进阶)结构体(全)

结构体声明

1.初始化

//结尾分号不能掉

2.特殊声明

//省略了标签类,C语言不会识别相等,省略了的声明基本只能使用一次

p=&x  就是不合法的

自引用:用地址

即结构中包含一个类型为该结构本身的成员是否可以呢?

是不可以的,这样sizeof就会无穷大,是不合理的

正确的自引用方式:取结构体地址

运用:链表

数据结构:其实是数据在内存中的存储和组织的结构

线性数据结构:顺序表,链表,栈,队列

注意:定义结构体(typedef) 中就不要用匿名结构体了

匿名结构体类型是无法自引用的

结构体内存对齐

对齐规则

要计算结构体大小,首先得掌握结构体的对齐规则:

 1. 结构体的第一个成员对齐到偏移量为0的位置

 2.其他数字对齐到处对齐数整数倍的地址

    对齐数==(编译器默认的  与  该成员变量 的较小值

    vs中默认为8 , linux中gcc没有默认对齐数,就是自身的大小

 3.结构体总大小为最大对齐数的整数倍

 4.嵌套结构体成员对其自己的成员中最大对齐数的整数倍,结构体的整体大小就是所有最大对齐       数的整数倍

有意思的是对齐数取的是较小值,整数倍取的是最大对齐数的整数倍

例题

通过对内存的分析,可以得到sizeof s4==32

存在原因

1.平台原因(移植原因):

  不是所有硬件平台都能访问任意地址上的任意数据的

2.性能原因:

   为了避免二次访问,防止访问对象被分放在两个内存块中了

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

那么如何尽可能的节省空间呢?

  让占用空间小的成员尽量集中在一起

修改默认对齐数 #pragma

结构体传参

传址的优越性

结构体实现位段

内存分配

介绍:位段的成员名后面有一个冒号和一个数字,来自定义所占bite位

作用:节省空间

位段的内存分配

运行以下代码

1. vs是从右向左存的

2. 一个字节(因为是char) 剩余的空间,不足下一个成员使用,存在浪费

跨平台问题和应用

问题:

 1.int 被当成有符号数还是无符号数不确定

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

运用: //ip数据报

要将信息从A传到B,像快递一样需要打包,除了数据之外的其他的就相当于寄件信息

注意事项:

位段的几个成员共有同一个字节,内存中每个字节分配一个地址,字节内部的bite是没有地址的

所以1.不能对位段成员使用&操作符

       2.不能使用scanf直接给位段成员输入值

正确示范:

int b=0;

scanf("%d",&b);

sa.b=b;

需要借助中间变量,不能直接 scanf("%d",&sa.b)

//看完有用的话,留下个赞再走叭~


相关文章
|
7月前
|
C++
C++系列十四:结构体
C++系列十四:结构体
|
编译器 C语言
C语言进阶教程(再论指针和数组(2))
C语言进阶教程(再论指针和数组(2))
66 2
|
2月前
|
C语言
学习——理解指针(4)(指针学习最后一节)
学习——理解指针(4)(指针学习最后一节)
|
6月前
|
C语言
20.(C语言)联合和枚举全
20.(C语言)联合和枚举全
20.(C语言)联合和枚举全
|
存储 C语言 C++
【C语言】一篇让你彻底吃透(结构体与结构体位段)(下)
【C语言】一篇让你彻底吃透(结构体与结构体位段)(下)
112 0
|
7月前
|
存储 安全 数据处理
C++系列十一:指针
C++系列十一:指针
|
存储 编译器 C语言
【C语言】一篇让你彻底吃透(结构体与结构体位段)(上)
【C语言】一篇让你彻底吃透(结构体与结构体位段)(上)
82 0
|
C语言
C语言实验十四 结构体
C语言实验十四 结构体
52 0
|
存储 C语言
C语言实验十一 指针(一)
C语言实验十一 指针(一)
97 0
c语言---指针进阶(2)--玩转指针
1.数组参数和指针参数 例1:一维数组传参 去掉数组名和元素个数,剩下的东西就是数组元素的类型 例2: 二维数组传参