一、课程笔记:
1、函数:
函数的三要素:函数名、形参、返回值
函数名:命名–>自注释性 动词+名词
函数参数:实参是什么类型,形参就要定义成什么类型;<传数组名>
传一维数组名,用元素的指针;
传二维数组名,用一维数组指针;
传三维数组名,用二维数组指针;
传指针数组名,用指针的指针;
传地址和传值:什么时候传地址什么时候传参?
a.当只使用不修改实参变量的值,传实参变量名;func(实参变量名)
b.当使用即修改实参变量的值,传实参变量的地址;func(&实参变量名)
2、内存管理:
(1)操作系统内存管理:总的来说,操作系统内存管理包括物理内存管理和虚拟内存管理。1.物理内存管理:包括程序装入等概念、交换技术、连续分配管理方式和非连续分配管理方式(分页、分段、段页式)。2.虚拟内存管理:虚拟内存管理包括虚拟内存概念、请求分页管理方式、页面置换算法、页面分配策略、工作集和抖动。这个系列主要使用linux内存管理来具体说明:linux内存管理
(2)常见的内存错误:
内存泄露、内存碎片、内存空洞
(3)malloc/free
(4)内存池(将使用多次malloc操作改变成只使用一次)malloc/free是一个开销非常大的操作
3、关键字:
(1)register:
作用:尽可能的将数据保存到CPU的寄存器中,提高程序的执行效率(省去了CPU通过总线从内存中抓取数据的时间)
(2)static:
①static修饰局部变量:延长了局部变量的生命周期,程序结束之后再释放(只执行一次)
②static修饰全局变量:静态全局变量,该变量不能再其他文件中访问
③static修饰函数:该函数只能被本文件的函数调用,不能被其他文件访问
(3)extern:
①不需要建立存储空间时使用;
②如果你想在本源文件中使用另一个源文件的变量,就需要在使用前用extern声明该变量,或者在头文件中用extern声明该变量
(4)const:
const:修饰变量,该变量成为一个只读变量(值是可以改变的)
const使用注意事项:修饰某个变量时,一定要初始化
4、什么时候用static?
无生命周期的用static,有生命周期的不用static。
(1)、全局静态变量:
在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
(2)、局部静态变量:
在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
课堂作业:
Q1free时如何知道释放了多大空间?
想知道free如何工作那肯定需要知道malloc如何工作,正所谓怎么来的就怎么回去。
使用malloc分配内存时候根据参数指定的大小,分配一块内存,然后返回这块内存的起始位置给调用者,这就是调用者拿到的所谓的指针。
起始这个指针并不是真正的起始位置,真正的指针在malloc返回指针 p 的前面,内存分配器在 p 的前面用两个字节的空间来存放分配的内存大小信息。
看下图:
(原文链接:https://blog.csdn.net/bdss58/article/details/94005337)
Q2static在什么情况下使用?
(1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
(2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)限制函数的作用域,在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
(4)在类中的static成员变量意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
Q3为什么要使用typedef给类型重命名?
作用:给已知数据类型重命名。
一是表明该类型的特殊作用,
二是将来有可能要改变这种类型(比如提高精度)
三是简化代码,便于批量修改具体类型。