1.内存分区模型
程序运行前
代码区:1.存放所写的代码;2.代码区共享+只读不改;
全局区:存放全局变量,静态变量,常量中的字符串常量,const修饰的全局变量(全局常量);
#include<iostream>
#include<string>
using namespace std;
int B=10;//函数体外为全局变量——位于全局区
int main()
{
int A;//定义在函数体中局部变量——位于其他区域中
cout<<"局部变量的地址:"<<(int)&A<<endl;
cout<<"全局变量的地址:"<<(int)&B<<endl;
//他们不在同一段内存空间中
//静态变量 static+普通变量,就是静态变量
static int C=12;
cout<<"静态变量的地址:"<<(int)&C<<endl;
//静态变量和全局变量的地址挨得较近
//常量
//字符串常量
cout<<"全局变量的地址:"<<(int)&”wawawa“<<endl;
const int c_g_A=9;
//const修饰全局常量
cout<<"全局常量的地址:"<<(int)&c_g_A<<endl;
const int c_l_B=8;
//*const修饰局部常量——————不在全局区,和局部变量放一起
cout<<"局部常量的地址:"<<(int)&c_l_B<<endl;
return 0;
}
运行
栈区:存放局部变量和函数的形参;*不要返回局部变量的地址,栈区的数据由编译器开辟和释放
#include<iostream>
#include<string>
using namespace std;
int *fun(int A)
{
A=10;
return &A;//返回局部变量的地址
}
int main()
{
int *p = fun(1);
cout<<*p<<endl;//
cout<<*p<<endl;//第一次可以打印,因为编译器做了保留
system("pause");//第二次这个数据不再保留了
}
堆区:由程序员管理释放,程序结束是操作系统回收;利用new关键字进行开辟内存
int*p=new int(10);//接收的是地址
delete p;//内存释放
在堆中创建数组
#include<iostream>
#include<string>
using namespace std;
int main()
{ //在堆中创建一个长度10的数组
int* p = new int [10];
//赋值
for (int i = 0;i < 10;i++)
{
p[i] = 100 - i;//[]也适用于指针
}
for (int i = 0;i < 10;i++)
{
cout << p[i] << endl;
}
//释放数组+[ ]
delete [] p;
system("pause");
}