栈区
存放局部变量和形参,由编译器自动释放
注意:不要返回局部变量的地址,函数执行完就自动释放了。
指针也是局部变量
*/
int* func() {
int a = 10;
return &a;//返回局部变量地址
}
int main()
{
/*栈区*/
int *p = func();
cout << *p << endl;//第一次正确,因为编译器做了保留
cout << *p << endl;
/*为什么打印p两次一样呢?*/
cout << p << endl;
cout << p << endl;
//因为p是在main函数中定义的,函数并没有执行完
}
堆区
new创建的数据,由程序员手动开辟,手动释放
可以返回地址,指针本质是局部变量在栈区 , 指针保存的数据在堆区
int * func2(){
int* p = new int(10);
return p;
}
int* func3() {
int* arr = new int[10];//数组
return arr;
}
int main()
{
int* p2 = func2();
cout << *p2 << endl;
cout << *p2 << endl;
cout << *p2 << endl;
delete p2;
int* arr = func3();
for (int i=0; i<10 ;i++)
{
arr[i] = 10;//此处存在疑惑,就是 arr是指针,为什么可以用作数组名
//在声明一个函数时,使用指针表达和使用数组表达也完全一样
//指针就是数组,数组就是指针,都是首地址
}
for (int i = 0; i < 10; i++)
{
cout << arr[i] << endl;
}
system("pause");
return 0;
}
int a = 10; 中的a在栈区,a被释放 ,*p当然访问不了a的内存
int* p = new int(10); p在堆区