c06.16

头文件中应该写什么:

面临的问题:

​ 头文件可能被任何源文件包含,意味着头文件中的内容会在多个目标文件中存在,合并不能冲突
重点:头文件中只能编写声明语句,不能有定义语句
​ 全局变量的声明 extern
​ 函数的声明
​ 宏常量
​ 宏函数
​ typedef 类型重定义
​ 结构、联合、枚举的类型的声明

头文件的编写规则:

​ 1、为每个.c文件写一份.h文件,因为.h文件是对.c文件的说明
​ 2、如果需要用到某个.c文件中的变量、函数、宏,只需要把它的头文件导入即可。
​ 3、.c文件也要导入它的.h 目的是为了让声明与定义一致

头文件重复包含:

​ 解决方案:添加头文件卫士

头文件之间的相互包含:

​ 假如a.h包含了b.h,b.h又需要包含a.h,这种情况就会编译错误
​ 解决方案:把a.h中需要的内容 和 b.h中需要的内容提取出来,编写成一个c.h

错误:未知的类型名‘xxxx’  一般都是头文件之间相互包含导致的(复制粘贴头文件也可能导致)

结构:

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

设计:
struct 结构体名
{
    类型 成员名;
    ...
};

定义结构变量:

​ struct 结构体名 结构体变量名;
​ 注意:c语言中,在定义结构体变量时,struct不能省略

定义结构变量并初始化:

​ struct 结构体名 结构体变量名 = {v1,v2,v3...};
​ 必须按照结构成员设计顺序来初始化

struct 结构体名 结构体变量名 = {.成员名=v1,.成员名=v2...};
只初始化某个成员,不用关注顺序

注意:同类型的结构变量可以直接赋值。

访问成员:

​ 结构体变量名.成员名;

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

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

结构体变量作为形参时:
由于结构体变量的字节数都比较大,值传递的效率比较低,因此都是传递结构变量的地址,如果不需要修改结构变量值,可以使用const保护

typedef 重定义结构类型

​ typedef struct 结构名 结构名;
​ 之后就不需要使用struct关键字了

typedef struct 结构名
{
    类型 成员名;
    ...
}结构名;

注意:一般结构体变量存放在堆内存

如何计算结构体的字节数:
结构体成员的顺序会影响它的总字节数,在设计结构体时如果成员的顺序合理安排,可以大大节约内存
内存对齐:
假定第一个成员从零地址开始,存储每个成员的地址编号必须能够被它的字节数整除,如果不能整除则填充空字节
内存补齐:
结构体的总字节数,必须是它最大字节成员的整数倍,如果不是则在末尾填充空字节

注意:在Linux系统下结算结构体的对齐和补齐时,如果最大成员的字节数超过4字节,则按照4字节计算,在windows系统按照实际情况计算

#pragma pack(n)
设置对齐、补齐的最大字节数, n<=默认 (1,2,4)

联合:union

​ 联合与结构的使用方法基本一致,与结构的区别是所有成员共用一块内存,一个成员的值发生改变,其他成员的值都随之改变。
​ 联合就是用少量的内存对应多个标识符,从而达到节约内存的目的,但是现在基本不再使用
​ 联合常考的笔试题:
​ union Data
​ {
​ char ch[5];
​ int num;
​ }
​ 注意:计算联合的字节数时,要考虑内存补齐

如何判断系统是大端还是小端?
    假如有一个十六进制数 0x01020304 存储在以0x0A为起始的4字节内存中

    高位数据存储在高位地址:小端系统 (0A:04 0B:03 0C:02 0D:01)
    高位数据存储在低位地址:大端系统 (0A:01 0B:02 0C:03 0D:04)

    个人计算机都是小端系统,而UNIX服务器和网络设备都是大端,网络字节序也是大端模式的数据

枚举:enum

​ 枚举就是一种数据类型,把可能出现的值全部罗列出来,取一个有意义的名字,除此之外,该类型的变量再等于其它数值就是非法的(愿望) g++编译器会限制

枚举可以看成是值受限的int类型,但是编译器为了效率并不去检查,所以在C语言中枚举也可以当做int类型变量使用

enum Direction {UP=183,DOWN=184,RIGHT=185,LEFT=186};

如果不给成员值,枚举常量的值默认从0开始,逐渐+1,如果给某个枚举常量设置值,后面的会在它的基础上逐渐+1
posted @ 2021-06-16 21:12  de06  阅读(36)  评论(0编辑  收藏  举报