2011-04-22 73 views
1
int main() 
{ 
    int x = 2, y = 4; 
    func(&x, &y); 
    printf("%d %d\n", x, y); 
    return 0; 
} 

void func(int *x, int *y) 
{ 
    int *temp; 
    temp = x; 
    x = y; 
    y = x; 
} 

您好传递一个指针地址

对于这个代码我不知道为什么输出是2 4代替4- 4.由于FUNC(X = Y)指X现在指向y的地址,并且func()中的y = x表示y现在指向x(它是y)的地址,现在这两个变量都已经指向y了。

非常感谢!

回答

1

不,func()将收到这些地址的副本,这不会影响到函数外部的变量 - 做局部变量func()所有变化都将被丢弃,一旦func()退出。

1

您只是暂时将'x'的地址分配给func中'y'的地址。为了完成这个任务,你需要取消引用你的指针。

*x = *y; 
*y = *x; 
2

答案很简单:你改变指针值内func - 而不是它们指向的值。我想你想交换变量(由于temp var)。

此代码应该工作(交换价值):

void func(int *x, int *y) 
{ 
    int temp = *x; // dereferencing the pointer to get the value it points at. 
    *x = *y; 
    *y = temp; 
} 

太让您最初的预期(这不作任何意义的代码明智的,由于第二次转让):

void func(int *x, int *y) 
{ 
    *x = *y; 
    *y = *x; 
} 
0

你'正在制作传入指针的副本,它们对于你的函数是本地的。你对他们所做的任何改变都不会影响外界。你应该参考&捕获指针。

void func(int*& x, int*& y){ 
    // as before... 
} 

现在,函数内部的更改将正确地反映在它之外。虽然问题依然存在。你传递的是局部变量的地址,并试图改变它们的指针 - 这是行不通的。当您获取变量&x的地址时,将创建一个新的临时指针,该指针不能转换为引用指针。 而是执行此操作:

int main(){ 
    int x = 2, y = 4; 
    int *px = &x, *py = &y; 
    func(px, py); 
    printf("%d %d\n",*px,*py); 
} 

编辑:如果你不是想交换/套的xy,而不只是一些指针的值,如做其他的答案状态。

1

试试这个

#include <iostream> 

using namespace std; 

void func(int *x, int *y); 

int main() 
{ 
    int x = 2, y = 4; 

    func(&x, &y); 

    //printf("%d %d\n", x, y); 

    cout << "X - " << x << endl; 

    cout << "Y - " << y << endl; 

    return 0; 

} 

void func(int *x, int *y)  
{ 
    int temp; 

    temp = *x; 
    *x = *y; 
    *y = temp; 

} 
0

的问题是,你想要编写自己的std::swap版本。这将工作:

int x = 2, y = 4; 
    std::swap(&x, &y); 
    printf("%d %d\n", x, y); 
    return 0;