1

可能重复:
使用指针交换对象

我知道如何使用指针进行交换,但是,如果我尝试这样的不同方法:

/* Pointers */
#include <stdio.h>
int main ()
{
  int a=4,b=6;
  swap(&a,&b);
  printf("A is %d, and B is %d\n",a,b);
  return 0;
}

int swap(int *a, int *b)
{
  int *temp;
  temp = a;
  a = b;
  b = temp;
  return 0;
}

它不起作用。基本上交换函数正在改变地址,就像'a'现在有'b'的地址,反之亦然。如果我打印出交换函数中的值,它会给出交换的值,但它不会反映在 main功能。谁能告诉我为什么?

4

4 回答 4

9

因为

交换函数正在改变地址,就像'a'现在有'b'的地址,反之亦然

不是真的。它不会改变他们的地址(这绝对没有任何意义)。该函数更改指针的- 这些指针是地址的副本,并且这些指针,因为它们是函数参数,因此对于函数来说是本地的。你要做的是:

int swap(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
    return 0;
}

或者您可以使用引用(仅在 C++ 中),如下所示:

int swap(int &a, int &b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
    return 0;
}

并在没有addressof 运算符的情况下调用它:

int a = 4, b = 6;
swap(a, b);

但是,如果这是用于实际实现,而不是“编写交换函数”式作业,那么您应该std::swap() 使用来自<algorithm>.

于 2013-01-06T07:54:57.093 回答
3

如果您只是使用标准方法将它们视为 inout,您将收到变量的副本,而不是实际变量。但是,当您传递 a 时,*variable您会给它一个指向实际变量的变量。然后您可以使用交换设置内存位置,因为内存位置的副本仍然相同。

所以试试这个代码为你的功能:

int swap(int *a, int *b)
{
  int tmp;
  tmp = *a;
  *a = *b;
  *b = tmp;
  return 0;
}
于 2013-01-06T08:24:19.923 回答
1

交换中的“a”和“b”不是主要的“a”和“b”。在交换中,这些是指针。如果要交换 a,b 指向的值,则需要:

int swap( int* pa, int *pb )
{
    int temp;
    temp = *pa;
    *pa = *pb;
    *pb = temp;
    return 0;
}

注意我使用了更合适的变量名。此外,您需要分配 temp(与分配指向 temp 的指针相比)。

于 2013-01-06T07:56:52.820 回答
0

您可以尝试使用:

int swap(int*& a, int*& b)
{
  int *temp;
  temp = a;
  a = b;
  b = temp;
  return 0;
}

请注意,堆栈地址无法移动,因此您需要不同的主地址:

int main ()
{
  int a=4,b=6;
  int *A = &a;
  int *B = &b;

  swap(A, B);
  printf("A is %d, and B is %d\n",*A, *B);
  return 0;
}
于 2013-01-06T08:44:19.233 回答