2.12、结构体与指针

结构体
自定义一个数据类型(构造类型);一种构造数据类型

由一个或多个基本数据类型构造而成的数据类型
1、定义一个结构体类型:
struct 结构类型名 {
成员1;
成员2;

};
在这里插入图片描述
2、定义一个结构体类型变量:
struct 结构类型名{
成员1;
成员2;

}结构体变量名;
在这里插入图片描述
3、给类型取别名:
typedef 原类型名 别名;
在这里插入图片描述
在这里插入图片描述
4、初始化:
struct 结构类型名{
成员1;
成员2;

}结构体变量名 = {成员1的值,成员2的值,…};

5、使用:
结构体不能整体使用,必须进入结构体,使用成员。
使用方法:
结构体名.成员;

当两个结构体类型完全一致的变量,直接赋值。

6、结构体的数据存放:
6.1按成员顺序依次存放。
6.2满足字节对齐要求。
6.3开辟结构体空间时,最小的开辟单位,4字节对齐。 2字节对齐 单字节对齐。
6.4空间使用,遵循紧凑原则。
在这里插入图片描述

7、结构体指针:

本质:是一个指针,指向结构体;
定义: 结构体数据类型 *结构体指针变量名;
struct st *stp = &st1;
使用: 引用结构体成员
方式1: (*stp).成员;
方式2: 结构体指针专用。
stp -> 成员;
在这里插入图片描述

8、结构体数组
本质:是数组,数组元素是结构体。
定义结构体数组:
struct st sta[3];
在这里插入图片描述
在这里插入图片描述

9、结构体指针数组:
本质:是一个数组,元素是结构体指针。
定义:
struct st *stpa[3];
将 物理存储不连续(内存中结构体),逻辑上可以连续(指针数组)
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

10、结构体数组指针:
本质:是一个指针,指向数组,数组元素是结构体。
定义:struct st (*stap) [4];
使用: (*stap) [0]—结构体
((*stap) [0]) .成员 —结构体成员
数组 结构体 函数 指针;

11、结构体中有特殊的成员;
结构体指针;
结构体指针数组;
在这里插入图片描述在这里插入图片描述在这里插入图片描述
使用 :在这里插入图片描述
12、字节对齐
现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。
对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那 么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数 据。显然在读取效率上下降很多。
其实我们都知道,结构体只是一些数据的集合,它本身什么都没有。我们所谓的结构体地址,其实就是结构体第一个元素的地址。这样,如果结构体各个元素之间不存在内存对齐问题,他们都挨着排放的。对于32位机,32位编译器(这是目前常见的环境,其他环境也会有内存对齐问题),就很可能操作一个问题,就是当你想要去访问结构体中的一个数据的时候,需要你操作两次数据总线,因为这个数据卡在中间。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41110647/article/details/106317380