内存的分区模型
c++程序执行时将内存大致划分为4个区域
- 代码区:存放函数体的二进制代码,由操作系统进行管理
- 全局区:存放全局变量和静态变量以及常量
- 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
- 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
在程序编译后,生成了执行该程序的前分为两个区域
代码区:
存放CPU执行的机器指令
代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令
全局区:
全局变量和静态变量存放在此
全局区还包含常量区,字符常量和其他常量也存放在此
该区域的数据在程序结束后由操作系统释放
堆区:
堆区数据由程序员管理开辟和释放
堆区数据利用new关键字进行开辟内存
new操作符
堆区开辟一个数,返回的是地址,用指针接收
示例
int *p = new int(10) //括号里是数值
堆区开辟一个数组,返回的是地址,用指针接收
示例
int *arr = new int[10] //括号里是数组大小
之后访问就正常访问,arr相当于数组名
释放数据用delete,其中释放数组用delete[] arr
引用
可以给变量起别名,用别名来操作变量
语法:数据类型 &别名 = 原名
例如:
int a = 10
int &b = a
就可以用b来操作a的数值了
注意事项
- 引用必须初始化
- 引用在初始化后,不可以改变
三种传递
值传递,形参改变不影响实参
void fun(int a, int b)
fun(a,b)
地址传递,形参改变影响实参
void fun(int *a, int *b)
fun(&a, &b)
引用传递,形参改变影响实参
void fun(int &a, int &b)
fun(a,b)
引用做函数返回值
作用:引用是可以作为函数的返回值存在的
注意:不要返回局部变量引用
用法:函数调用可以作为左值
例如
int& test(){
static int a = 20;
return a;
}
test() = 1000;//相当于对返回的引用修改其内容
引用的本质
引用的本质在c++内部实现是一个指针常量
常量引用
int& ref = 10;//这是错误的,引用本身需要一个合法的内存空间
const int& ref = 10就正确了,原因是编译器对代码进行了优化
相当于执行了 int temp = 10; const int& ref = temp;
作用:常量引用主要来修饰形参,防止误操作
在函数形参列表中,可以加const修饰形参,防止形参改变实参
函数补充
函数默认参数注意事项:
1、如果某个位置参数有默认值,那么从这个位置往后的参数都必须有默认值
2、如果函数声明有默认参数,函数实现就不能有默认参数,声明和实现只能一个有默认参数
函数重载:
1、同一作用域
2、函数名相同
3、函数参数类型不同,或者个数不同,或者顺序不同
4、碰到默认参数会出现二义性,报错,要避免