Pace 12 (自定义类型:结构体 位段 枚举 联合)

来源:互联网 发布:无情对 知乎 编辑:程序博客网 时间:2024/06/05 03:54

结构体

1.结构体的地址 :地址从小到大,且结构体的地址和第一个成员的地址相同,元素地址依次增大

2.结构体的声明 :结构体是一些值得集合,这些值称为成员变量,每个成员可以是不同类型的变量


3.结构体成员的访问

结构体变量访问成员 :通过( . )访问,点操作符接受两个操作数

struct stu{char name[20];int age;};int main(){struct stu s;strcpy(s.name, "zhangsan");s.age = 20; //通过点操作符访问结构体成员}
结构体访问指向变量的成员 :通过( -> )访问

struct stu{char name[20];int age;};int main(){struct stu *s;strcpy(s->name, "zhangsan");s->.age = 20; //通过 -> 指向访问结构体成员}
4.结构体的自引用

5.结构体内存对齐 :计算结构体的大小 (单位:字节)

    规则:(1)第一个成员在与结构体偏移量为0的地址处

(2)其余变量要对齐到对齐数的整数倍的地址处

  对齐数=编译器默认对齐数与该成员大小的最小值(VS 默认 8   Linux 默认 4)

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

(4)如果结构体嵌套结构体,嵌套的结构体对齐到自己的最大对齐数的整倍数。结构体整体的对齐数为最大对齐数的整倍数

例1:


例2:


S1与S2的类型成员完全相同,但是S2比S1所占内存却更小。

所以,在我们设计结构体时,为了节省空间,我们应尽量让占用空间小的成员聚集在一起。


例3:


例4:



6.结构体传参


分析以上的代码,print1和print2选择哪一个进行结构体传参?

应首选pring2

因为函数传参时需要创建栈帧结构,在传递结构体对象时,如果结构体过大,参数压栈系统开销比较大,导致性能下降。


位段

1.成员:位段的成员必须输 int,unsigned int,signed int,char。成员名后面有一个冒号和一个数字。

2.创建:创建方法与结构体一致,只是在每个成员后加一个冒号和一个数组。

struct A{int a : 2;int b : 5;int c : 10;int d : 30;}A;
3.位段的大小:

位段成员冒号后的数字代表这个成员所占有的bit位的位数



与结构体相比,位段可以节省很多空间,但是无法解决跨平台问题。


枚举

1.枚举就是将现实中有限的集合一一列举出来

2.枚举类型的定义:

enum Day{Mon,Tues,Wed,Thur,Fri,Sat,Sun};
{}中的内容是枚举的可能取值,也叫枚举常量。这些可能取值都是有值得,默认是从0开始,一次递增1

也可以在定义的时候赋值,赋值以前的元素依旧保持从0开始,依次递增1,在赋值以后的可能取值按赋的值依次递增1

3:有点

(1)代码的可读性高

(2)比#define定义的标识符更加的严谨

(3)防止命名污染

(4)便于调试

(5)使用方便,一次可定义多个常量


联合(共用体)

1.联合类型的声明

union Un{char c;int i;};
联合也是一种自定义类型。

这种类型定义的变量包含一系列成员,这些成员公用一块空间。

每一个成员的地址都等于联合体的地址

2.联合体的大小:

(1)联合体的大小,至少是最大成员的大小


(2)当最大成员的大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍。



阅读全文
0 0
原创粉丝点击