【C++学习】内存分区

栈区

存放局部变量和形参,由编译器自动释放
注意:不要返回局部变量的地址,函数执行完就自动释放了。
指针也是局部变量

*/
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在堆区
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值