传递指针地址

Passing a pointer address

本文关键字:地址 指针      更新时间:2023-10-16
int main()
{
  int x = 2, y = 4;
  func(&x, &y);
  printf("%d %dn", x, y);
  return 0;
}
void func(int *x, int *y)
{
  int *temp;
  temp = x;
  x = y;
  y = x;
}

对于这段代码,我不知道为什么输出是24而不是4 4。由于func()中的x = y意味着x现在指向y的地址,而func()中的y = x意味着y现在指向x的地址(即y),因此两个变量现在都已经指向y了。

多谢!

答案很简单:您更改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;
}

不,func()将接收这些地址的副本,这不会影响函数外的变量-一旦func()退出,对func()本地变量所做的所有更改将被丢弃。

您只是暂时将'x'的地址分配给函数中的'y'的地址。为了进行赋值操作,需要对指针解引用。

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

试试这个

#include <iostream>
using namespace std;
void func(int *x, int *y);
int main()
{
  int x = 2, y = 4;
  func(&x, &y);
  //printf("%d %dn", 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;
}

您正在复制传入的指针,它们是您的函数的局部。你对它们做的任何改变都不会影响外部。您应该通过引用&来捕获指针。

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 %dn",*px,*py);
}

Edit:如果您想要交换/设置xy的值,而不仅仅是一些指针,请按照其他答案的状态执行。

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

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