笔记
杂项
二.共用体
2.1共用体的引入目的
当需要将多个变量共享同一块内存时,可以使用共用体
2.2定义及初始化
1)概念:由相同数据类型或不同数据类型构成的集合,但是,该集合中的成员共享同一块内存空间
2)定义格式
union 共用体名称
{
成员类型1 成员变量1;
成员类型2 成员变量2;
...........
成员类型n 成员变量n;
}
3)共用体初始化
共用体初始化与结构体一致(初始化给定一个值即可,因为成员共享一块内存空间)
4)共用体访问成员跟结构体一致
5)共用体成员中可以包含基本数据类型,也可以包含构造数据类型
6)共用体变量的大小,是所有成员中占内存最大的成员的大小
7)共用体变量一般不作为函数参数传递
三.类型重定义
3.1引入目的
当程序员写程序时,可能会因为数据类型的问题,在定义变量时,导致该程序比较晦涩难懂。
为了提高代码的简洁性,以及为了更加方便理解使得代码更加优雅,我们可以将这些类型重新起一个简洁好记的名字
3.2使用方式
1)类型重定义,我们引入关键字typedef
2)使用方法:typedef 旧名字 新名字
类如:typedef unsigned long int uint64
3.3目前所接触过的数据类型
int a; //定义一个普通变量,变量名为 a
int arr[5]; //定义一个长度位5的整型数组,数组名位arr
int *ptr; //定义一个一级指针变量,变量名为ptr
int **pptr; //定义了一个二级指针变量,变量名为pptr
int *ptr_arr[5]; //定义一个长度为5的指针数组,数组名为ptr_arr
int (*arr_ptr)[5]; //定义了一个数组指针,指向长度为5的数组,变量名为arr_ptr
int (*fun_ptr)(void); //定义了一个函数指针变量,指向返回值为int参数为空的函数,变量名为fun_ptr
int (*fun_ptr_arr[5])(void); //定义了一个函数指针数组,数组名为fun_ptr_arr
//提取类型
int ; //定义一个普通变量类型
int [5]; //定义一个长度位5的整型数组类型
int *; //定义一个一级指针变量类型
int **; //定义了一个二级指针变量类型
int *[5]; //定义一个长度为5的指针数组类型
int (*)[5]; //定义了一个数组指针类型
int (*)(void); //定义了一个函数指针变量类型
int (*[5])(void); //定义了一个函数指针数组类型
//将上面的类型进行重定义
typedef int a; //定义一个普通变量,变量名为 a
typedef int arr[5]; //定义一个长度位5的整型数组,数组名位arr
typedef int *ptr; //定义一个一级指针变量,变量名为ptr
typedef int **pptr; //定义了一个二级指针变量,变量名为pptr
typedef int *ptr_arr[5]; //定义一个长度为5的指针数组,数组名为ptr_arr
typedef int (*arr_ptr)[5]; //定义了一个数组指针,指向长度为5的数组,变量名为arr_ptr
typedef int (*fun_ptr)(void); //定义了一个函数指针变量,指向返回值为int参数为空的函数,变量名为fun_ptr
typedef int (*fun_ptr_arr[5])(void); //定义了一个函数指针数组,数组名为fun_ptr_arr
3.4#define与typede的区别
1)#define是宏定义,使用宏名取代字符串,typedef是进行类型重命名,要求必须给定的是数据类型
2)#define是预处理指令,预处理时,进行替换,typede时C语言语句,发生在程序执行阶段
3)在使用上面两种方式命名一个变量时,没有太大区别,但是,命名多个不同类型变量时,就有区别了
四.内存划分
1)一个进程一旦启动后,操作系统会为其分配4G的虚拟内存
2)分为两个部分:内核空间(1G高地址)、用户空间(3G低地址)
3)多个进程独立拥有0—3G用户空间,共享3—4G的内核空间
用户空间又分为多个部分,具体如图所示
4)通过指令:cat/proc/进程ID/maps 可以查看当前进程的内存分布
5)使用指令:pamp -d 进程ID号 可以查看当前进程所有的空间分配大小
(查看ID号:pidof 执行文件名)
五.动态内存分配和回收
1)对于堆区空间的数据,我们也可以利用起来,对于栈区的内存空间,会随着所在的函数空间的结束而结束
2)可以在堆区由程序员手动申请一片内存来使用,其生命周期到程序员手动释放该空间为止,或者整个程序结束
3)对堆区空间的使用函数
六.预处理指令
1)预处理指令,执行在分布编译的预处理阶段,所有的预处理指令都是以#开头,没有分号结束
2)文件包含指令:相当于将引入的文件中的内容,在引入部分写了一份
3)宏定义指令:就是定义一个常量,用宏名表示后面的字符串,使用中,只替换不计算不做正确性检测