这部分内容在引用作为函数的参数这个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就好了,和之前的重复了。