内存分区模型
- 代码区:存放函数的二进制代码(程序运行前)
- 全局区:存放全局变量和静态变量以及常量(程序运行前)
- 栈区:由编译器自动分配释放,存放函数的参数值,局部变量
- 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
内存四区的意义
不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程
- 代码区:
存放cpu执行的机器指令
代码区是共享的:
对于频繁被执行的程序,只需要保存一份代码即可
代码区是只读的:
防止程序意外的修改了它的指令
- 全局区:
存放全局变量和静态变量和常量
常量中存放const修饰的全局常量和字符串常量
- 栈区
不要返回局部变量地址(栈区的数据在函数完成后自动释放)
- 堆区(new)
new的基本语法
new 数据类型(值) // 类似malloc
例:
int * p=new int(10);//小括号创建一个变量,为10
int *arr=new int[10];//中括号表示创建一个数组
delete(指针) //类似free
引用
作用:给变量起别名
语法:数据类型 &别名 = 原名
int a = 10;
int &b = a;
注意事项
- 引用必须初始化
- 引用在初始化后不可以改变
int &b;//未初始化
int &b=a;
int &b=c;//不可以改变
引用做函数参数
- 作用:函数传参时可以利用引用的技术让形参修饰实参
- 优点:可以简化指针修改实参
int a=10;
int b=20;
mySwap(int &a,int &b)
{
int tmp=a;
a=b;
b=tmp;
}
mySwap(a,b);//实现ab的交换
引用作函数返回值
- 不要返回局部变量的引用
int& test()
{
int a = 0;
return a;
}
int &ref=test();//返回局部变量的引用
- 函数的调用可以作为左值
int& test()
{
static int a = 10;
return a;
}
int ref=test();//
test()=1000;//将a的引用赋值
引用的本质
本质:在c++的内部实现是一个指针常量
int a = 10;
int& ref = a;// int *const ref =&a;
ref=20;//内部发现ref是引用,自动转化为*ref=20;
常量引用
作用:修饰形参防止误操作
int a = 10;
const int &ref = 10;//int tmp = 10;const &ref = tmp;
int b = 100;
void showValue(int &val)
{
val = 1000;//val会被修改
cout<<"val="<<val<<endl;
}
showVale(b);
int c = 100;
void showValue(const int &val)
{
val = 1000;//报错
cout<<"val="<<val<<endl;
}
showVale(c);