这段C++程序为什么不能交换两个变量的值??

来源:百度知道 编辑:UC知道 时间:2024/06/06 16:18:04
#include <iostream>

using namespace std;

void swap(int *, int *);

int main(void)
{
int a = 100, b = 200, *p1, *p2;
p1 = &a;
p2 = &b;
swap(p1, p2);
cout << *p1 << " " << *p2 << endl;
return 0;
}

void swap(int *x, int *y)
{
int *t;
t = x;
x = y;
y = t;
}
正确的函数内交换方法我知道。。。既然指针可以在调用函数内保留地址,为什么在SWAP函数内如上写法就还是不能交换呢?费解~~~~~~~~(我知道如果省略这个函数的内容而直接写在MAIN中可以顺利实现)我就是想知道这个错误的详细原因解释。。谢谢各位。

专门把谭浩强的《C程序设计》翻出来。原文是这么写的:不能企图通过改变指针形参的值而值指针实参的值改变。C语言中实参变量的形参变量之间的数据传递是单向的“值传递”方式。指针变量作函数参数也遵循这一规则,调用函数不可能改变实参指针变量的值,但可以改变实参指针变量 所指变量 的值。

因为指针传递也属于值传递。
#include <iostream>

using namespace std;

void swap(int *, int *);

int main()
{
int a=100, b=200, *p1, *p2;
p1 = &a;
p2 = &b;
swap(p1,p2);
cout << *p1 << " " << *p2 << endl;
cout<<a<<b;
return 0;
}

void swap(int *x, int *y)
{
int t;
t = *x;
*x = *y;
*y = t;
}

把程序改成我这样就可以了,还是你定义的函数的问题。问题的原因主要在于,你在swap函数中两个参数其实是通过形参交换的地址值只是在形参中变化,并没有影响到实参的变化。所以你应该写成
int t;
t = *x;
*x = *y;
*y = t; 才可以。

void swap(int *x, int *y) // 给定2个整型指针,交换其内容
{
int *t; // 临时指针
t = x; // 这里只是将指针进行赋值,而不牵扯到指针指向的内容
x = y;
y = t; // 执行结束后, x,y,t三个指针将指向同一空间
}

比如主函数中,
a的值是100,a的地址是0x11