在C预言的学习中,提到函数参数的值传递和指针传递,最为经典的是例子莫过于 交换两个参数的值:SWAP( int p, int q);
int a = 1, b = 2;
(1)void swap ( int p, int q)
{
int temp;
temp = p;
p = q;
q = temp;
}
swap ( a, b);是不能交换a和b的值的。这样传的是值得副本,函数体内的p和q只是a和b的一个拷贝,p和q的值确实交换了,但是他们是局部变量,不会影响到a和b。当swap()函数调用结束后,p和q所在的栈也就被删除了。所以可以说是做了无用功。
(2) void swap ( int *p, int *q)
{
int *temp;
*temp = *p;
*p = *q;
*q = *temp;
}
swap( &a, &b);也是有问题的。函数体内的形参p和q是指向实际参数a和b的指针。但是temp作为一个新的指针变量还没有分配内存。*temp = *p是把p所指向的内存里的值拷贝到temp所指向的内存里,由于temp还没有分配内存,于是系统在拷贝时临时给了一个随机的地址存拷贝的值,分配的随机地址是“不正常”的,且函数结束后不收回,造成内存泄露。此函数是否可以编译通过,和编译器有关。在VS2010中不能通过编译。
(3) void swap ( int *p, int *q)
{
int *temp;
temp = p;
p = q;
q = temp;
}
swap(&a, &b);也是不能实现交换a和b的值的目的的。在函数体内的确是交换了p和q的值:p原来指向a的值,q原来指向b的值,交换后p指向b的值,q指向a的值。但是,当函数执行结束时,p和q便消失了,用a和b访问将会是交换前的值。
(4) void swap ( int *p, int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
swap(&a, &b);是可以实现交换a和b的值得目的的。通过temp这个中间变量,改变了a和b的值。
(5) void swap ( int &p, int &q)
{
int temp;
temp = p;
p = q;
q = temp;
}
swap(a, b);也是可以的。引用传递修改的结果直接影响实参。