引语:为什么要分区?
就像我们家里的厨房摆放餐具一样,我们总是把每次吃饭都要用的筷子放在方便取的地方,把碗放在一开柜门就能拿出来的地方,而一些相对来说不那么容易取的地方,则放那些大号的碟子,比如家里来客人才会用到的碟子。这让是不是方便了我们日常生活。
同样,因为我们在编程序的时候,会产生很多类型不同的数据,比如局部变量,全局变量,静态局部变量,静态全局变量。我们如果把他们放在同一个地方,我们在编程时会很麻烦。不同区域存放不同数据,赋予不同的生命周期,给我们带来更大的灵活编程
分四个区
代码区
定义
存放函数体的二进制代码,由操作系统进行管理。
特点
共享:目的是对于频繁被执行的程序,只需在内存中有一份代码即可
只读:防止程序意外的修改了它的指令,如我们打游戏时候每次购买道具的单价不可被更改
全局区
在程序结束后由操作系统释放,存放有全局变量,静态变量,常量,以及static修饰的全局变量
常量:字符串常量、const修饰的全局变量(链接性为内部)(放在全局区),但是const修饰的局部变量不在全局区!!!
int g_a = 20; //全局变量
int g_b = 20; //全局变量 g_a、g_b这两个全局变量在所有文件都可被访问
const int c_g_a = 50; //const修饰的全局变量,链接性为内部,即只有本文件可访问
#include<iostream>
using namespace std;
int mian()
{
return 0;
}
小知识点:C++在程序还未运行前,内存分为全局区和代码区
栈区
由编译器自动分配释放,存放函数的参数,局部变量以及const修饰的局部变量
注意事项:不要返回局部变量的地址!!!!!!!
函数返回一个a的地址
int* func1()
{
int a = 10;
return &a; //局部变量的返回
}
int main(){
int *p = func1();
cout << *p << endl; //第一次打印成功,是编译器做了保留
cout << *p << endl; //此时会报错,因为当第二次打印时编译器已经不再保留了
}
会
堆区
堆区地址用new开辟,地址由程序员管理开辟(new)和释放(delete)
New的基本语法,new返回是数据类型的指针
#include<iostream>
using namespace std;
void test1(){
int* arr = new int[10]; //返回一个连续空间的首地址。此处当作数组
for(int i = 0; i < 10; i++){
arr[i] = 100 + i;
}
for(int i = 0; i < 10; i++){
cout << arr[i] << endl;
}
//记得new开辟的堆区空间需要释放
delete[] arr; //释放数组,需要加[],提醒编译器该地址为数组
}
int main(){
test1();
return 0;
}
关于new 和delete
语法:new 数据类型
利用new创建的数据,会返回该数据对应的类型的指针,如堆区代码里,我们new了一个连续空间,所以用数组这个数据结构来存储着片空间,而用int* 来接受该连续空间的首地址。
我们用delete来释放空间,如delept p;又比如我们代码中delete[] arr;
当我们释放了这片空间后就不可以再使用,如再上述代码delete[] arr;后面若加一行
cout << arr[0] <<endl; 这是不被允许的。