传递指针地址

时间:2011-04-22 09:13:10

标签: c++ pointers

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.因为f =()中的x = y表示x现在指向y的地址,而func()中的y = x表示y现在指向x的地址(即y),两个变量现在都指向y。

非常感谢!

6 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您只是暂时将“x”的地址分配给func中的“y”地址。为了进行分配,您需要取消引用指针。

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

答案 3 :(得分: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;

}

答案 4 :(得分: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的值,而不仅仅是某些指针,请执行其他答案状态。

答案 5 :(得分:0)

问题是您正在尝试编写自己的std::swap版本。这将有效:

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