交换指针

时间:2013-01-06 07:51:23

标签: c++ c pointers

  

可能重复:
  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中功能。谁能告诉我为什么?

4 个答案:

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

并将其命名为,无地址运营商:

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

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

答案 1 :(得分:3)

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

请尝试使用此功能代码:

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

答案 2 :(得分:1)

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

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

注意我正在使用更合适的变量名称。此外,您需要分配temp(vs指向temp的指针)。

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