餐饮手机微网站怎么做,深圳布吉做网站,wordpress 页脚改颜色,抖音代运营工作怎么样目录
结构体
结构体类型的定义形式
结构体类型的大小
内存计算例子
共用体union 用共用体判断大小端
结构体和共用体对比
qsort#xff08;#xff09; 结构体
结构体类型——用来描述复杂数据的一种数据类型
构造类型#xff08;用户自定义类型#xff09; struc…目录
结构体
结构体类型的定义形式
结构体类型的大小
内存计算例子
共用体union 用共用体判断大小端
结构体和共用体对比
qsort 结构体
结构体类型——用来描述复杂数据的一种数据类型
构造类型用户自定义类型 struct 结构体类型名 { 成员列表; }; struct关键字表明是在构造一个结构体的类型
结构体名用来描述结构体这个类型的一个名称
成员列表表示要描述的复杂数据中用到的具体的成员变量 定义的方式与之前变量的方式相同 多个成员变量之间用分号隔开
最后有一个分号表示结束
struct student
{char name[30]; int sno;float score;char sex;
};//表示定义出一个数据类型
有数据类型可以定义变量、指针变量、数组 结构体使用方法 自己构造出这个结构体类型 有了类型——定义变量、数组、指针 结构体类型的指针——做函数形参、做函数返回值 结构体类型的使用过程
先定义出类型
定义变量
定义变量
struct 结构体名 变量名;
结构体初始化
struct student s {};
看每个成员变量具体是什么数据类型
根据每个成员变量自身的数据类型进行初始化
初始化顺序按照定义的顺序依次初始化
struct student s {666,jack,1,90.4};
结构体变量的引用
结构体数据引用时一般是引用到具体的数据
运算符 . (结构体成员运算符)
结构体变量名.成员变量名访问某个结构体的成员
s.sno引用s中的sno
结构体类型的数组
struct student s[3]; - 指向结构体成员运算符
结构体指针-成员名
结构体类型的定义形式
形式1:先定义类型然后定义变量 struct demo {}; struct demo d; 形式2:定义类型的同时定义变量 struct demo { } d; 形式3:定义类型的同时定义变量可以省略结构体名
结构体类型只用一次 struct { } d; 结构体类型的大小
内存对齐
结构体的对齐规则内存地址的对齐
1.在32位的平台上默认都是按4字节对齐的
2.对于成员变量各自在自己的自然边界上对齐 char——1字节 short ——2字节 int——4字节 3.如果:成员变量中有比4字节大 此时整个结构体 按照4字节对齐。 4.如果:成员变量中没有有比4字节大。此时 整个结构体 按照最大的那个成员对齐 32位的平台 如果有超过4字节按照4字节对齐。如果没有超过4字节的则按成员变量中最大对齐 64位的平台 如果有超过4字节按照超过的最大的成员对齐。如果没有超过4字节的则按成员变量中最大对齐 同类型的结构体变量之间可以相互赋值 struct student s1; struct student s2; s2 s1; 结构体类型的大小计算 内存对齐是指将数据存储在特定的地址上以便硬件能够更高效地访问这些数据。不同的数据类型例如int、char、float等通常有不同的对齐要求这些要求通常与数据类型的大小相关。例如 char类型的数据通常要求对齐到1字节的边界。int类型的数据通常要求对齐到4字节的边界。double类型的数据通常要求对齐到8字节的边界。 内存对齐规则 基础对齐原则结构体中的每个成员都必须按照其数据类型的对齐要求对齐。比如如果一个结构体包含一个int那么这个int成员必须出现在一个4字节对齐的地址上。 结构体对齐规则结构体的总大小必须是其最大成员对齐要求的整数倍。例如如果一个结构体中最大的成员是double8字节对齐那么结构体的总大小也必须是8的倍数即使可能会存在一些“填充字节”padding bytes。 为什么要内存对齐提高效率 内存对齐的主要目的是提高访问内存的效率。在现代计算机中CPU通常是按块比如4字节或8字节从内存中读取数据的。如果数据是对齐的CPU可以一次性读取整块数据这样效率更高。 如果数据未对齐CPU可能需要进行多次内存访问才能读取完整的数据或者需要进行额外的计算来调整地址这会导致性能下降。 内存计算例子 在这个结构体 demo1 中有一个整数成员 int i 和一个匿名 union该 union 包含以下三个成员
char s[7]一个长度为7的字符数组占用7个字节。int v一个整数占用4个字节。float f一个浮点数占用4个字节。
结构体的内存计算 匿名 union 的大小 union 的大小由其最大的成员决定。char s[7] 占用7个字节。int v 占用4个字节。float f 占用4个字节。 因此union 的大小为7字节char s[7] 是最大的成员。 结构体的对齐要求 int i 需要4字节对齐。union 的最大成员 char s[7]虽然它本身是7个字节但由于int v和float f可能会让整个结构体具有更严格的对齐要求假设int和float都需要4字节对齐整个 union 的大小可能会被填充到8个字节。 计算总大小 int i 占用4字节。union 占用8字节对齐到4字节的倍数。因此整个结构体 demo1 的大小为4int i 8union 12字节。
共用体union
语法 union 共用体名 { 成员变量 }; union demo { char a short b; int c; }; 共用体共用一块内存空间最大成员的空间 共用体初始化时只能给一个值且默认给到第一个成员 共用体变量中的值取决于最后一次给的值还要看能影响几个值 用共用体判断大小端 在这个代码片段中union 中有两个成员
int a通常占用4个字节char b占用1个字节
由于 union 中所有成员共享同一块内存因此 union 的大小由其最大的成员决定。在这个例子中int a 是 union 中最大的成员占用4个字节。因此这个 union 的大小是 4字节 isLittleEndian 函数 该函数用于检查系统的字节序大端或小端union 初始化时将 int a 设为 1假设int为4字节即 0x00000001然后通过 char b 访问 union 的第一个字节 如果系统是小端序little-endianchar b 将读取 0x01函数返回 1如果系统是大端序big-endianchar b 将读取 0x00函数返回 0 结构体和共用体对比
结构体中各个成员拥有自己独立的空间
共用体成员共用一块内存空间
qsort
qsort()功能排序数组 void qsort(void *base,//要排序的数组的首地址 size_t nmemb,//数组元素的个数 size_t size,//单个元素的大小 int (*compar)(const void *, const void *));//比较函数——提供比较依据 int compar(const void *a, const void *b) {//比较函数——a、b代表要比较的数组元素 }