【问题标题】:Swapping pointers [duplicate]交换指针[重复]
【发布时间】:2013-01-06 07:51:23
【问题描述】:

可能重复:
Swapping objects using pointers

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

/* 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功能。谁能告诉我为什么?

【问题讨论】:

  • 是 C 还是 C++?我会推荐两种不同的东西。
  • 那是原贴的错,不代表答案有误。
  • 问题的主题具有误导性,因为它说 交换指针 并且公认的解决方案实际上是关于交换这些指针的内容。使用此解决方案,ab 仍然指向相同的内存地址。因此,从我的角度来看,您应该将问题重命名为 swap integers 或 @JensGustedt 建议的内容(重复)

标签: c++ c pointers


【解决方案1】:

因为

交换函数正在改变地址,就像'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;
}

并称它为没有地址运算符:

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

但是,如果这是针对实际实现,而不是“编写交换函数”式作业,那么您应该使用来自&lt;algorithm&gt;std::swap() function

【讨论】:

  • @chris 是的,我也在添加那个。
  • 好吧..让我明白一件事..如果我在主函数中声明一个指针,并将任何变量的地址分配给该指针,那么该指针也将“仅”保存副本地址??
  • @UnderDog,它与任何其他变量相同。假设您将一个指针分配给另一个指针,然后将第一个指针重新分配给一个新地址。第二个仍然存储旧地址。为了解决这个问题,您可以让第二个成为对指针的引用,这样当第一个更改为新的指针时,第二个也会这样做。
【解决方案2】:

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

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

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

【讨论】:

  • 我正在寻找的解释。谢谢!
  • @UnderDog 没问题,很高兴为您提供帮助。出于好奇,这是为了课程吗? CS50?
【解决方案3】:

swap 中的'a' 和 'b' 不是 main 中的 'a' 和 'b'。在交换中,这些是指针。如果你想交换a,b所指向的值,你需要:

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

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

【讨论】:

    【解决方案4】:

    您可以尝试使用:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-01
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多