传递动态内存:
下面5个幻术哪一个能够成功进行两个数的交换?
#include <iostream>
using namespace std;
void swap1(int p, int q)
{
int temp;
temp=p;
p=q;
q=temp;
}
void swap2(int *p, int *q)
{
int *temp;
*temp=*p;
*p=*q;
*q=*temp;
}
void swap3(int *p, int *q)
{
int *temp;
temp=p;
p=q;
q=temp;
}
void swap4(int *p, int *q)
{
int temp;
temp=*p;
*p=*q;
*q=temp;
}
void swap5(int &p,int &q)
{
int temp;
temp=p;
p=q;
q=temp;
}
int main(){
int a=1,b=2;
//swap1(a,b);
//swap2(&a,&b);
//swap3(&a,&b);
//swap4(&a,&b);
//swap5(a,b);
cout <<a <<" " <<b << endl;
return 0;
}
swap1传的是值的副本,在函数体内被修改了形参p、q(实际参数a、b的一个拷贝),p、q的值的确交换了,但是它们是局部变量,不会影响到主函数中的a和b。当函数swap1生命周期结束时,p,q所在栈也就被删除了。
swap2传的是一个地址进去,在函数体内的形参*p、*q是指向实际参数a、b地址的两个指针。但是这里注意:
int *temp;
*temp = *p;
以上语句是不符合逻辑的一段代码,int *temp新建一个指针(但没有分配内存)。*temp = *p不是指向而是拷贝。把*p所指向的内存里的值(也就是实参a的值)拷贝到*temp所指向内存里了。但是int *temp不是不分配内存吗?的确不分配,于是系统在拷贝时临时给了一个随机地址,让它存值。分配的随机地址是个“意外”,且函数结束后不收回,造成内存泄露。
swap3传的是一个地址进去,在函数体内的形参*p、*q是指向实际参数a、b地址的两个指针。这里需要注意的是(itnt *temp; temp = p;) int *temp新建一个指针(但没有分配内存)。temp = p是指向而不是拷贝。temp指向了*p所指向的地址(也就是a)。而代码
p=q;
q=temp;
意思就是p指向了*q所指向的地址(也就是b)。q指向了*t所指向的地址(也就是a)。但是函数swap3不能实现两个数的交换,这是因为函数体内只是指针的变化,而对地址中的值没有改变。
函数swap4可以实现两数的交换,因为它修改的是指针所指向地址中的值。
函数swap5函数与swap4类似,是一个引用传递,修改的结果直接影响实参。