一、内存分区模型
代码区:存放函数体的二进制代码,有操作系统进行管理的
存放CPU执行的机器指令
代码区是共享的,共享的目的是对频繁被执行的程序,只需要在内存中有一份代码即可
代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令
全局区:存放全局变量和静态变量以及常量,其中常量区存放const修饰的全局常量和字符串常量
全局变量和静态变量存放在此
全局区还包括了常量区,字符串常量和其他常量也存放在此
该区域的数据在程序结束后由操作系统释放
栈区:由编译器自动分配释放,存放函数的参数值,局部变量
注意:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
new操作符
c++中利用new操作符在堆区开辟数据
堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符delete
二、引用
引用的基本使用→作用:给变量起别名
语法:数据类型 &别名 = 原名
引用的注意事项:引用必须初始化、引用在初始化后,不可以改变
注意: int &c = a; → 初始化; int &c = d; → 错误的,初始化后,不可改变; c = b; → 此处是赋值操作,不是更改引用
引用做函数参数
引用传递,形参会修饰实参的
引用做函数返回值
作用:引用是可以作为函数的返回值存在的
注意:不要返回局部变量引用
1 // 不要返回局部变量的引用 2 int &test01() 3 { 4 int a = 10; // 局部变量存放在栈区 5 return a; 6 } 7 8 int main() 9 { 10 int &ref = test01(); 11 12 cout << "ref = " << ref << endl; // 第一次结果正确,是因为编译器做了保留 13 cout << "ref = " << ref << endl; // 第二次结果错误,因为a的内存已经释放 14 /*输出结果: ref = 10 ref = 1657912288*/ 15 }
函数的调用可以作为左值
1 int &test01() // 引用函数 2 { 3 static int a = 10; // 静态变量,存放在全局区,全局区中的数据在程序结束后系统释放 4 return a; 5 } 6 7 int main() 8 { 9 int &ref = test01(); // 此处 &ref 初始化后,成为函数a的别名 10 11 cout << "ref = " << ref << endl; 12 test01() = 1000; // 该处是对函数中的 返回值 a重新赋值 13 14 cout << "ref = " << ref << endl; // 此处 ref 作为a 的别名,输出的值也是与返回值a相等,test01() 引用函数返回值改变a 改变 ref 随之改变 15 /*输出结果:ref = 10 ref = 1000*/