C++ 传递动态内存

31 篇文章 10 订阅

这部分内容在引用作为函数的参数这个blog中有一些涉及,为了讨论引用传递顺带了参数传递与指针传递,在这里从动态内存传递的角度梳理一下,先看这样一个题目:
下面五个函数中,哪些函数能够实现值的交换?

#include "iostream"    

using namespace std;

void swap1(int ,int);
void swap2(int* ,int*);
void swap3(int* ,int*);
void swap4(int *,int*);
void swap5(int &,int&);
int main()
{
	int i =3,j = 5;
	//swap1(i,j);
	//swap2(&i,&j);
	//swap3(&i,&j);
	//swap4(&i,&j);
	//swap5(i,j);
	cout<<i<<endl<<j<<endl;
	getchar();
	return 0;
}
void swap1(int a,int b)
{
	int temp;
	temp = a;
	a =b;
	b= temp;
}
void swap2(int *a,int *b)
{
	int *temp;
	*temp = *a;
	*a =*b;
	*b= *temp;
}
void swap3(int *a,int *b)
{
	int *temp;
	temp = a;
	a =b;
	b= temp;
}
void swap4(int *a,int *b)
{
	int temp;
	temp = *a;
	*a =*b;
	*b= temp;
}
void swap5(int &a,int &b)
{
	int temp;
	temp = a;
	a =b;
	b= temp;
}

(1)swap1函数显然不能,不解释了。

(2)swap2函数传的是一个地址,形参a,b是指向i,j的地址,函数内在做地址内值的交换,而不是做指向的交换,函数执行完后a还指向i,b还指向j,但是i,j地址内的值已经换了,这样来看的话貌似没啥问题,但是这个函数的代码写错了:

    int *temp;
	*temp = *a;

定义了指针temp,而在执行*temp = *a;的时候,想要把指针指向的值赋值给temp指向的值,但是temp在定义的时候没有指向任何地址,也就是它是一个空指针,但是我们又硬要给一个不存在的内存赋值,此时系统就会给一个随机地址,但是这个随机地址在函数结束的时候不会收回,这就造成了内存泄漏
而且swap2的代码在vs2010里无法运行,编译没问题但是报异常,既然是由于上面的原因,那么我们就在temp定义的时候初始化它呗,这样temp就有了指向的内存:

void swap2(int *a,int *b)
{
	int  c;
	int *temp=&c;
	*temp = *a;
	*a =*b;
	*b= *temp;
}

(3)我们先跳过swap3直接看swap4,此时temp是个int型变量,a,b还是指向i,j的指针,然后我们发现,它还是在修改指针指向的地址内的值,也就是和swap2的交换没啥区别,唯一的区别在于:
swap2存的值在temp指针指向的地址中,用*temp取值;
swap4存的值就是temp变量。
前者多此一举。

(4)swap3中a,b分别是指向i,j的指针,在函数中完成了指针指向的交换,就像这样:
这里写图片描述
它确实实现了指向的交换,但是这并没有什么用,a,b本来就是函数的局部变量,再怎么改也不会影响i,j。

(5)直接参考引用的blog就好了,和之前的重复了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值