代码区特点是共享和只读。
全局区存放全局变量,静态变量(实质就是static修饰的变量),常量。
常量又分为字符串常量以及const修饰的全局变量。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
int a_g = 10;
int b_g = 10;//全局变量
const int c_a_g = 10;
const int c_b_g = 10;
int main()
{
int a = 10;
int b = 10;//局部变量
cout << "局部变量a的地址为:" << (int)&a << endl;
cout << "局部变量b的地址为:" << (int)&b << endl;//只要带有局部那么在内存区中就不在全局区中
const int a_l = 10;
const int b_l = 10;//const修饰的局部变量。
cout << "局部变量a_l的地址为:" << (int)&a_l << endl;
cout << "局部变量b_l的地址为:" << (int)&b_l << endl;
static int a_q = 10;//静态变量
static int b_q = 10;
cout << "静态变量a_q的地址为:" << (int)&a_q << endl;
cout << "静态变量b_q的地址为:" << (int)&b_q << endl;
cout << "全局变量a_g的地址为:" << (int)&a_g << endl; //全局变量
cout << "全局变量a_g的地址为:" << (int)&a_g << endl;
cout << "c_a_g的const修饰的全局常量地址为:" << (int)&c_a_g << endl;
cout << "c_b_g的const修饰的全局常量地址为:" << (int)&c_b_g << endl;//const修饰的全局变量为常量
cout << "字符串常量s_a的地址为:" << (int)&"你啊哈哦啊" << endl;
cout << "字符串常量s_b的地址为:" << (int)&"你啊哈哦啊" << endl;//字符串常量与const修饰的全局变量统称为常量
string s_a = "你啊哈哦啊";//注意此时的s_a不属于字符串常量
system("pause");
return 0;
}
栈区
由编译器自动分配释放。存放的函数的参数值。局部变量
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//栈区
//由编译器自动分配释放。存放的函数的参数值。局部变量
//注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。
int* fun_c()
{
int a = 10;
return &a;
}
int main()
{
int* p = fun_c();
cout << *p << endl;//第一个能打出来10是因为编译器能够保留一份数据
cout << *p << endl;//第二个以及后边的打印不出来是因为当打印完第一个10之后,
//编译器会自动释放栈区开辟的这块空间,如果再打印属于是非法对这片内存空间进行操作
cout << *p << endl;
system("pause");
return 0;
}
堆区
由程序员分配释放,若程序员不释放程序结束时由操作系统释放。
在c++中主要利用new在堆区开辟内存。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//堆区
//由程序员分配释放,若程序员不释放程序结束时由操作系统释放。
//在c++中主要利用new在堆区开辟内存。
int* fun_c()
{
int *p = new int(10);//用指针返回开辟的这块堆内存的编号
return p;
}
int main()
{
int* p = fun_c();
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
system("pause");
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
int* fun_c()
{
int* p = new int(10);
return p;
}
void test2()
{
//创建10整形的数组
int *arr=new int[10];//共十个元素
for (int i = 0; i <= 9; i++)
{
arr[i] = 100 + i;
}
for (int j = 0; j < 10; j++) {
cout << arr[j] << endl;
}
//释放堆区数组
//释放的时候加[]才可以
delete[]arr;
}
int main()
{
int* p = fun_c();
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;//前三个可以打印是因为我创建了堆区
delete p;
cout << *p << endl;//最后一个无法打印是因为我把堆区的这片空间释放了,在访问属于非法访问操作
void test2();
system("pause");
return 0;
}