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)

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


相关文章
|
1月前
|
C++
C++系列十四:结构体
C++系列十四:结构体
|
7月前
|
编译器 C语言
C语言---函数---知识点总结(二)---定义函数
C语言---函数---知识点总结(二)---定义函数
|
8月前
|
编译器 C语言
C语言进阶教程(再论指针和数组(2))
C语言进阶教程(再论指针和数组(2))
44 2
|
6月前
|
存储
1.C语言题目---指针类(基础)
1.C语言题目---指针类(基础)
40 1
|
23天前
|
C语言
20.(C语言)联合和枚举全
20.(C语言)联合和枚举全
20.(C语言)联合和枚举全
|
11月前
|
存储 C语言
C语言实验十一 指针(一)
C语言实验十一 指针(一)
67 0
|
11月前
|
C语言
C语言实验十二 指针(二)
C语言实验十二 指针(二)
44 0
|
11月前
|
C语言
C语言实验十四 结构体
C语言实验十四 结构体
38 0
|
C语言 C++
《C和指针》读书笔记(第八章 数组)(上)
《C和指针》读书笔记(第八章 数组)(上)
|
存储 编译器 C语言
《C和指针》读书笔记(第八章 数组)(下)
《C和指针》读书笔记(第八章 数组)