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(void)
{
int a = 1, b = 2;
swap1(a, b);
swap2(&a, &b);
swap3(&a, &b);
swap4(&a, &b);
swap5(a, b);
return 0;
}
怎么样,看完后你认为的正确答案是什么呢?我们来逐个分析下。
总的来说,这个题考查的是函数参数传递,值传递,地址传递,引用传递。
先看第一个,swap1传的是值得副本,也就是说在函数内部,p,q的值确实交换了,但是他们是局部变量,不会影响到主函数的a,b。当swap1返回时,p、q也就被删除了。所以swap1是不能完成a、b的值的交换的。
swap2传的是一个地址过去,但是指针temp并没有初始化(没有分配内存),*temp = *p是不合法的。
swap3也是传一个地址过去,本来p指向a的地址,q指向b的地址,在函数返回的时候p指向b的地址,q指向a的地址,看似p、q的地址交换了,*p、*q的值也交换了,但是对于a、b来说并没有任何变化。
swap4可以实现值得交换,它修改了指针所指向地址的值的值,也就是实参的值。
swap5和swap4类似,这是一个引用传递。