将内存分为4个区域
代码区:存放二进制代码
全局区:存放全局变量,静态变量,常量
栈区:编译器自动分配释放;存放局部变量,函数的参数
堆区:由程序员分配和释放;若程序员不释放,程序结束时操作系统回收
四区意义
不同区域存放的数据,赋予不同的生命周期,灵活编程
各区介绍
1.1程序运行前
代码区:共享的;只读的
全局区:在程序结束后由操作系统释放
1.2程序运行后
栈区:不要返回局部变量的地址,函数执行完栈就关闭了
堆区:在c++中主要利用new在堆区开辟内存
#include<iostream>//namespace 命名空间 ; pause 暂停 ; global 全局 ;static 静态 ;local 局部 ; const 局部
using namespace std;
int g_a = 10;//全局变量
int g_b = 10;//全局变量
const int c_g_a = 10;//全局常量int main() {//全局区//全局变量,静态变量,常量int a = 10;//局部变量cout << "局部变量a的地址:" << (int)&a << endl;int b = 10;//局部变量cout << "局部变量b的地址:" << (int)&b << endl;cout << "全局变量g_a的地址:" << (int)&g_a << endl;cout << "全局变量g_b的地址:" << (int)&g_b << endl;static int s_a = 10;//静态变量cout << "静态变量s_a的地址:" << (int)&s_a << endl;cout << "字符串常量:" << (int)&"hello" << endl;//全局变量和静态变量近,字符串常量离得不远,在一个区域段中,局部变量离得较远const int c_l_b = 10;//局部常量cout << "全局常量c_g_a的地址:" << (int)&c_g_a << endl;cout << "局部常量c_l_b的地址:" << (int)&c_l_b << endl;//大前提是全局,静态,字符串在一起,局部和局部在一起;在此基础上,常量更靠近常量,变量更靠近变量//在堆区开辟数据int* p = func();cout << *p << endl;system("pause");return 0;
}int * func() {int * p = new int(10);//在堆区创建一个对象,返回的是地址,用指针接收return p;
}
#include<iostream>
using namespace std;
//1.new的基本语法
int* fun() {//在堆区创建整型数据//new返回的是该数据类型的指针int* p = new int(10);return p;
}
void test01() {int* p = fun();cout << *p << endl;cout << *p << endl;//堆区的数据由程序员开辟释放delete p;//cout << *p << endl; 会报错,内存已经被释放,再次访问就是非法
}//2.在堆区利用 new开辟数组
void test02() {int* arr = new int[10];//返回的是数组的首地址for (int i = 0; i < 10; i++) {arr[i] = i + 100;}for (int i = 0; i < 10; i++) {cout << arr[i] << endl;}delete[] arr;
}
int main() {test01();test02();system("pause");return 0;
}