学习记录:第四周day01笔记

结构:

结构是由程序员自己设计的一种数据类型,用于描述一种事务的各项数据,由若干个不同的基础类型组成

设计

struct 结构体类型名

{

类型名 成员名

...

};

定义:

struct 结构体类型名 结构体变量名;

注意:C语言中定义结构体变量时,struct关键字不能省

初始化:

struct 结构体类型名 结构体变量名={v1,v2,...};//可以少给,其余会执行值初始化,但必须按顺序

struct 结构体类型名 结构体变量名={.成员名1=v1,.成员名2=v2,...};//可以指定初始化某些成员,不用按顺序

struct 结构体类型名 结构体变量名=同类型结构变量;//可以利用同类型结构变量进行整体赋值

注意:未初始化的结构体变量中的指针变量是野指针,不能直接对它scanf,因为此时该指针未分配内存,很有可能段错误

访问成员:

结构体变量.成员名

结构体指针->成员名//实际上执行 *结构体指针.成员名

typedef重定义结构类型

(1)重定义结构体变量:

typedef struct 结构类型 结构类型;

typedef struct 结构类型

{

}结构类型;

(2)重定义结构体指针:

typedef struct 结构类型* 结构类型;

typedef struct 结构类型

{

}*结构类型;

一些骚操作:

声明结构体的同时,定义结构体变量并初始化

struct 结构类型

{

} 结果变量名={...}

如何计算结构体的总字节数:

结构体成员的顺序可能会影响它的总字节数,因此如果能在设计结构体时合理安排成员顺序可以大大地节约内存

(1)内存对齐:

假定第一个成员从零地址开始,存储每个成员的地址编号必须能被该成员字节数整除,如果不能整除则填充空白字节数直到能整除为止

(2)内存补齐:

结构体的总字节数,必须能被它字节数最大的成员变量整除,如果不能则在末尾填充空白字节直到能整除为止

在Linux系统中,计算结构体的对齐和补齐时,如果成员的类型字节数超过4,按4字节算

在Window中,会根据实际字节数计算

#progma pack(n) 设置对齐、补齐的最大字节数,在Linux中只有1和2与默认效果不同,超过4失效

练习1:设计一个教师结构体,成员有:姓名、性别、工号、工龄,定义一个教师结构变量并通过scanf输入各项成员的数据并显示

 

 

联合:union

联合与结构的使用方法基本一致,与结构的区别是所有成员共用一块内存,其中一个成员的值改变,其他成员的值也会随之改变

联合就是想用少量的内存存储较多的标识符,从而节约内存的目的,现在基本不再使用了

常考的联合笔试题:

union Data

{

char ch[5];

int num;

};//5不能被4整除,所以要补齐到8

注意:计算联合的字节数虽然不考虑内存对齐,但是依然要考虑内存补齐

如何判断系统大小端?

小端:低位数据存储在低位地址,高位数据存储在高位地址

大端:低位数据存储在高位地址,高位数据存储在低位地址

注意:个人计算一般都是小端,但是UNIX服务器和网络设备都是大端,因此本地数据(本地字节序)传输到网络设备(网络字节序)时需要进行转换,该转换称为序列化反序列化

练习2:编写程序,判断本系统是大端还是小端?

 

枚举:enum

枚举类型是希望把一种类型可能出现的所有值罗列出来,并取一个有意义的名字表示,除此之外,该类型的值如果是其它值则非法

注意:gcc不检查是否非法,g++检查

枚举常量:就是枚举成员、枚举变量

可以把枚举当作值受限的int类型,但是gcc编译器不检查,所以在C语言中更多地是为了增加代码的可读性

注意:如果枚举成员不初始化,成员的值默认从0开始,逐个+1;如果某个成员指定了初始值,后续的成员在它基础上逐个+1

 

枚举变量与宏常量的区别:

1、枚举常量需要占用内存,而定义宏常量不占内存

2、枚举常量的设计目的是为了限制实际数据输入、宏常量是为了完成代码的替换和维护

3、枚举常量是具有类型的,宏定义没有类型

 

任务:把通讯录的数据存储改成结构体存储

posted @ 2023-04-18 10:35  菊里菊气  阅读(12)  评论(0编辑  收藏  举报