代码运行前
-
代码区:存放函数体二进制代码,由操作系统进行管理
-
全局区
#include<iostream>
using namespace std;
//全局变量:在main函数外的变量
int g_a = 10;
int g_b = 10;
//const修饰的全局变量
const int c_g_a = 10;
int main()
{
cout << "全局变量g_a的地址为:" << (int)&g_a << endl;
cout << "全局变量g_b的地址为:" << (int)&g_b << endl;
cout << "const修饰的全局变量c_g_a的地址为:" << (int)&c_g_a << endl;
//静态变量:在普通局部变量前加tatic
static int s_a = 10;
static int s_b = 10;
cout << "静态变量s_a的地址为:" << (int)&s_a << endl;
cout << "静态变量s_b的地址为:" << (int)&s_b << endl;
//局部变量
int a = 10;
int b = 10;
cout << "局部变量a的地址为:" << (int)&a<< endl;
cout << "局部变量b的地址为:" << (int)&b << endl;
//常量
//字符串常量
cout << "字符串常量的地址为:" << (int)&"hello" << endl;
//const修饰的局部变量
const int c_l_a = 10;
cout << "const修饰的局部变量的地址为:" << (int)&c_l_a << endl;
system("pause");
return 0;
}
代码运行后
- 栈区
#include<iostream>
using namespace std;
int* func(int b = 100)
{
int a = 10;//a是局部变量,局部变量存放在栈区,程序执行完后自动释放
return &a;
}
int main()//b是形参,也会放在栈上
{
//接收func函数的返回值
int* P = func(1);
cout << *P<< endl;//第一次编译器会保留数据,所以编译正确
cout << *P << endl;//编译器只会保留一次,所以第二次打印会出错,所以不要返回局部变量的地址
system("pause");
return 0;
}
- 堆区
#include<iostream>
using namespace std;
int* func()
{
//在堆区创建一个数据
//利用new关键字在堆区开辟一块内存,它返回的是地址的编号,我们要用指针区接收它。
//利用new开辟的数据,会返回该数据类型对应的指针
//利用new开辟的数据需要用delete释放
int *p=new int(10);
return p;
}
//new的语法
void test_01()
{
int* p = func();
//堆区的数据由程序员管理开辟和释放,调用地址时不会出错
cout << "test_01输出值 "<<*p << endl;
delete p;
//cout << "test_01输出值 " << *p << endl;内存已释放,再次读取是非法操作
}
//利用new语法开辟一个数组
void test_02()
{
//创建一个有10个整型数据的数组在堆区
int * arr=new int[10];//这里的10不是初始值,而是数组中元素个数,返回的是这个数组连续内存的首地址
for (int i = 0; i < 10; i++)
{
arr[i] = 100 + i;
}
for (int i = 0; i < 10; i++)
{
cout<<"test_02输出值 "<<arr[i]<<endl;
}
delete[]arr;//释放一个数组,数组指针名是arr
}
int main()
{
int* p = func();
cout << "01-*p输出值 "<<*p << endl;
cout <<"02-p的输出值 "<< p << endl;
test_01();
test_02();
system("pause");
return 0;
}