内存分区模型
1 代码区
2 全局区
// 全局变量、静态变量、常量
#include <iostream> using namespace std; // 全局变量、静态变量、常量 //全局变量 int g_a=10; int g_b=10; //const修饰的全局常量 const int c_g_a = 10; const int c_g_b = 10; int main() { //创建普通局部变量 int a = 10; int b = 10; cout << "局部变量a的地址为:" << (int)&a << endl;//&a取地址,(int)强制转换为10进制 cout << "局部变量b的地址为:" << (int)&b <<endl<<endl; //全局变量 cout << "全局变量g_a的地址为:" << (int)&g_a << endl; cout << "全局变量g_b的地址为:" << (int)&g_b << endl<<endl; //静态变量 static int s_a = 10; static int s_b = 10; cout << "静态变量s_a的地址为:" << (int)&s_a << endl; cout << "静态变量s_b的地址为:" << (int)&s_b << endl << endl; //常量(字符串常量、const修饰的变量) //字符串常量 cout << "字符串常量的地址为:" << (int)&"hello word" << endl; //const修饰的变量(全局常量、局部常量) //const修饰的全局变量 cout << "全局常量 c_g_a的地址为:" << (int)&c_g_a << endl; cout << "全局常量 c_g_b的地址为:" << (int)&c_g_b << endl; //const修饰的局部变量 const int c_a = 10; const int c_b = 10; cout << "局部常量 c_a的地址为:" << (int)&c_a << endl; cout << "局部常量 c_b的地址为:" << (int)&c_b << endl << endl; system("pause"); return 0; }
总结
3 栈区
栈区注意事项
不要返回局部变量的地址 栈区的数据由编译器管理开辟和释放#include <iostream> using namespace std; //栈区注意事项 //不要返回局部变量的地址 //栈区的数据由编译器管理开辟和释放 int *func(int b)//形参数据也存放在栈区 { b = 100; int a = 10;//局部变量:存放在栈区,栈区的数据在函数执行完毕自动释放 return &a;//返回局部变量的地址 } int main() { //接受func函数的返回值 int *p=func(1); cout << *p << endl;//第一次可以打印正确的数字,因为编译做了一次保留 cout << *p << endl;//第二次,就没了,输出乱码 system("pause"); return 0; }
4 堆区
#include <iostream> using namespace std; int *func() { //利用new关键字,将数据开辟到堆区 //指针本质也是局部变量,存放在栈上,指针保存的数据存放咋堆区 int* p = new int(10); return p; } int main() { //在堆区开辟数据 int* q = func(); cout << *q << endl;//与上一个程序对比,多输出几次 cout << *q << endl; cout << *q << endl; cout << *q << endl; system("pause"); return 0; }
5 new运算符
#include <iostream> using namespace std; //1.new的基本语法 int* func() { //在堆区创建整形数据 //new返回的是数据类型指针 int* p = new int(10); return p; } //2.在堆区利用new 开辟数组 int main() { //在堆区开辟数据 int* q = func(); cout << *q << endl;//与上一个程序对比,多输出几次 cout << *q << endl; cout << *q << endl; //堆区数据是由程序员管理开辟、管理释放 //如果想释放堆区数据,利用关键字delete delete q; cout << *q << endl;//内存已被释放,再次访问就是非法操作,报错 system("pause"); return 0; }
#include <iostream> using namespace std; //1.new的基本语法 //2.在堆区利用new 开辟数组 void test() { //创建10整形数据的数组,在堆区 int *arr =new int[10];//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; } int main() { test(); system("pause"); return 0; }
注意:
释放堆取数组 释放数组的时候,要加[]才可以,否则认为是只是放一个元素