代码区:存放函数体的二进制代码,有操作系统管理
全局区:存放全局变量和静态变量
栈区:由编译器自动分配释放,存放函数的参数值、局部变量
堆区:由程序员分配和释放
1.代码区
共享的,只读的
2.全局区
存放全局变量和静态变量 还包括常量区、字符串区和其他常量区
该区域的数据在程序结束后由操作系统释放
#include<iostream>
using namespace std;
//全局变量
int g_a=10;
int g_b=20;
//1)const修饰的全局变量
const int c_g_a=10;
int main()
{
//创建局部变量
int a=10;
int b=20;
cout<<"a address:"<<(int)&a<<endl;
cout<<"b address:"<<(int)&b<<endl;
cout<<"g_a address:"<<(int)&g_a<<endl;
cout<<"g_b address:"<<(int)&g_b<<endl;
//静态变量,在普通变量前面加 static
static int s_a=10;
cout<<"s_a address:"<<(int)&s_a<<endl;
//字符串常量
cout<<"字符串常量地址:"<<(int)&"hello"<<endl;
//const修饰的变量
cout<<"全局常量c_g_a:"<<(int)&c_g_a<<endl;
//2)const修饰局部变量
int c_l_a=10;
cout<<"const修饰局部变量c_l_a地址"<<(int)&c_l_a<<endl;
system("pause");
return 0;
}
3.栈区
栈区:由编译器自动分配释放,存放函数的参数值、局部变量
注意:不要返回局部变量地址
栈区数据在函数执行之后自动释放
4.堆区
堆区:由程序员分配和释放
c++利用new在堆区开辟内存
#include<iostream>
using namespace std;
int * func()
{
//利用new关键字 将数据开辟到堆区
int *p=new int(10);//*P本质是局部变量,放在栈上,而指针保存的数据在堆上
return p;
}
int main()
{
//在堆区开辟数据
int *p=func();//用指针接收
cout<<*p<<endl;
system("pause");
return 0;
}
5.new操作符
c++利用new操作符在堆中开辟数据
堆区开辟的数据由程序员手动开辟、手动释放,释放利用操作符:delete
语法 : new 数据类型
利用new创建的数据会返回该数据对应的指针
#include<iostream>
using namespace std;
//1.new的基本语法
int*func()
{
//在堆区创建整型数据
//new返回是该数据的指针
int*p=new int(10);
return p;
}
void test01()
{
int*p=func();
cout<<*p<<endl;
//堆区开辟的数据由程序员手动开辟、手动释放
//如果想释放:delete
delete p;
//cout<<*p<<endl;//内存已经被释放,再次访问报错
}
//2.在堆区开辟数组
void test02()
{
//创建10个整型数组,在堆区
int*arr=new int[10];//代表数组有10个元素
//赋值
for(int i=0;i<10;i++)
{
arr[i]=i+100;//给10个元素赋值 100—109
}
//打印
for(int i=0;i<10;i++)
{
cout<<arr[i]<<endl;
}
//释放堆区数组
//释放数组的时候要用[]
delete[]arr;//释放arr指针
}
int main()
{
test01();
test02();
system("pause");
}