1.全局区内存管理:
在这里插入代码片:
#include<iostream>
using namespace std;
//全局变量
int g_a = 10;
int g_b = 10;
//全局常量
const int c_a = 10;
const int c_b = 10;
int main()
{
int a = 10;
int b = 10;
//局部变量
cout << "局部变量 a: " << (int)&a <<endl;
cout << "局部变量 b: " << (int)&b <<endl;
//全局变量
cout << "全局变量 g_a: " << (int)&g_a <<endl;
cout << "全局变量 g_b: " << (int)&g_b <<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;
//常量
//字符串常量
cout << "字符串常量的地址为: " << (int)&"hello world" << endl;
//const修饰的常量
//const修饰的全局常量
cout << "全局常量 c_a: " << (int)&c_a <<endl;
cout << "全局常量 c_b: " << (int)&c_b <<endl;
//const 修饰局部变量
const int c_l_a = 10;
const int c_l_b = 10;
cout << "局部常量 c_l_a: " << (int)&c_l_a <<endl;
cout << "局部常量 c_l_b: " << (int)&c_l_b <<endl;
}
分析结果:我们可以看到谁的地址与谁接近,就是跟谁是一伙的
所以这里总结有:
2.栈区的内存管理:
在这里插入代码片:
#include<iostream>
using namespace std;
//栈区数据注意事项 ---不要返回局部变量的地址
//栈区的数据由编译器管理开辟和释放
int* func() //返回int类型的地址,所以要带"*"号
//同时如果有形参,也会被放在栈上
{
int a = 10;
return &a;
}
int main()
{
int * p = func(); //用指针接收返回值
cout << *p <<endl; //第一次可以打印正确的数字 ,是因为编译器做了保留
cout << *p <<endl; //第二次不在保留
}
3.堆区管理模型:
在这里插入代码片:
#include<iostream>
using namespace std;
int * func()
{
//利用new关键字 , 可以将数据开辟到堆区(它会返回开辟的地址)
//在这里,指针本质也是局部变量,放在栈上,指针保存的数据是放在堆区的
int * p = new int(10);
return p;
}
int main()
{
// 在堆区开辟数据
int *p = func();
cout << *p << endl;
}
在栈区生成的指针会保存内存中的一个标志位,其中这个标志位对应的是堆区保存的一个程序员所赋的值
4.堆区内存的释放:(程序员通过软件释放或者系统回收)
在这里插入代码片:
#include<iostream>
using namespace std;
//1.new 的基本语法
int * func() //返回指针类型的函数(也就是返回产生堆的原地址)
{
//在堆区创建一个整形的数据
//new返回的是,该数据类型的指针
int *p = new int(10);
return p; //返回的是指针
}
void test()
{
int * p = func();
cout << *p <<endl;
cout << *p <<endl;
cout << *p <<endl;
//堆区的数据,由程序员管开辟,程序员管理释放
//如果想释放堆区的数据,利用关键字 delete
delete p;
cout << *p <<endl; //内存已经被释放,所以该数据就是非法操作
}
void test2()
{
//创建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;//释放数组要加一个[]才行
for(int i = 0; i < 10; i++) //打印会出错
{
cout << arr[i] <<endl;
}
}
int main()
{
test2();
}