一、内存四区
1.全局区:存储全局变量、静态变量、字符串常量、全局常量(const修饰的全局变量)
2.代码区:存放CPU执行的机器指令,具有两个特点:共享、只读
3.栈区:存放局部变量和形参
注意事项:不要返回某一个函数中局部变量的地址,因为栈区的数据在函数执行完之后自动释放。(有可能编译器会允许第一次这样的操作,是因为有的编译器会保留释放前的数据)
栈区开辟的数据由编译器自动管理、释放
4.堆区:由程序员分配释放,若程序员不释放,程序结束时由操作系统回收
在C++中利用new来开辟一块内存
利用new关键字可以将数据开辟到堆区
4.1 new--delete用法:
堆区开辟数组:
注意:开辟单个数据是 new+类型+ ( )
开辟数组是new+类型+【】
4.2 new和malloc区别(面试题)
C++ new和malloc的区别_Linux猿的博客-优快云博客_c++ new和malloc的区别
二、引用
作用:给变量起别名
语法:数据类型 &别名 = 原名 (原名和别名指向同一块内存)
引用注意事项:引用必须初始化;引用在初始化后不可以发生改变
e.g. int a = 10; int &b = a;(必须初始化)
这个时候b已经是a的一个别名了,从此以后b只能是a的别名了!
引用做函数参数
void mySwap ( int &a, int &b ) { // 引用方式传入
int temp = a;
a = b;
b = temp;
return;
}
省去了传指针的繁琐~
引用做函数返回值
作用:引用是可以作为函数的返回值存在的
注意:不要返回局部变量的引用(道理和函数不要返回局部变量是一样的,因为会释放)
上面这个就是返回了局部变量的引用了,第一次没问题,因为编译器会帮你保存释放前的数据,但是第二次打印就会有问题了(就不给你保存了)
结果:
那么如果我们把上面的那个局部变量换成静态变量,也就是把“原名”从栈中弄到了全局区,那么就没有问题了:
此外,函数调用可以作为左值
如上面的函数如果这样写: func1(0.5) = 38.2
其实就相当于一个赋值操作,此时静态变量ret就会变成38.2
引用的本质:
引用的本质在c++内部实现是一个指向变量的常量指针(指针的指向是不可以修改的,但是指针指向的值是可以改动的)
int& ref = a; 相当于 int* const ref = &a;
(复习: 指向变量的常量指针 *在const的前面 )
常量引用:
作用:主要用来修饰形参,防止误操作
解释:
普通引用是不可以把一个常数作为“原名”的,因为普通常数是在专门的常数区,并没有一个合法的内存空间,因此不可直接引用
但是用 const int& ref = 10 就是合法的了,这个时候编译器会优化代码(如上所示)
在showValue这个函数的形参中我们发现加了const,这个就能够防止在函数中对所引用的值造成修改。