程序执行前
1.代码区
存放CPU执行的机器指令
代码区是共享的,对于频繁执行的代码,在代码区只会存放一份。
代码区是只读的,防止代码被篡改。
2.全局区
存放全局变量,静态变量,常量
局部变量是在函数里的变量 : int a = 1
全局变量可被任何函数使用
静态变量 前加static :static int a= 3
常量 (1)字符串常量:"hello world"
(2.1)const 修饰的全局变量 :const int a
(2.2)const 修饰的局部变量:const int b
程序执行后出现的
1.栈区
由编译器自动分配释放,函数的参数值,局部变量,形参
注意事项:不要返回局部变量的地址,因为栈区开辟的地址会自动释放
int * func() //因为这里返回的是一个指针,所以int *
{
b = 100; //形参
int a = 10;
return &a;
}
int main()
{
int *p = func();
cout << *p << endl; //第一次输出10
cout << *p << endl; //第二次输出乱码,因为第二次这个数据不再被保留了,func()运行完地址就被释放了
}
4.由程序员分配,若没释放,由系统释放
主要用new 开辟内存
int * func() //因为这里返回的是一个指针,所以int *func() = int *p 为一个确定值
{
int *p = new int(10) //在堆区开辟内存,赋予这地址一个整型的值,将地址存到指针变量中
//指针还是一个局部变量,在栈区存的是一个地址编号0x0001,指针所保存的数据在堆区,堆区的数据编号为0x0001
return p;
}
int main()
{
int *p = func();
cout << *p << endl; //第一次输出10
cout << *p << endl; //第二次输出10,因为堆区的数据由程序员管理,不自动释放
}
5.NEW操作符
c++利用new操作符在堆区开辟数据,释放数据 delete p
堆区开辟数组,释放数组的特殊形式 delete[] arr
有程序员手动开辟,手动释放,释放操作符 delete
语法:new 数据类型
p代表地址,*代表指向,*p代表实际值
void test01()
{
double *p = func();
cout << *p << endl;
cout << *p << endl;
delete p; //可以用delete 将地址释放
//cout << *p << endl; //内存已释放,访问非法,报错
}
void test02() //堆区开辟数组
{
int * arr = new int[10]; //代表创建了一个有十个元素的数组,名字无所谓,也可叫p
for (int i = 0; i < 10; i++)
{
arr[i] = i + 10;
}
for (int i = 0; i < 10; i++)
{
cout << arr[i] << endl;
}
delete[] arr; //加[]表明释放的是数组
}
int main()
{
test01();
test02();
system("pause");
return 0;
}