为什么即使我使用指针,我的代码也不会交换变量的值?

时间:2016-06-09 03:20:41

标签: c++ c pointers swap

#include<stdio.h>
void mystery(int *ptra, int *ptrb) 
{
   int *temp;
   temp = ptrb;
   ptrb = ptra;
   ptra = temp;
}
int main() 
{
    int a=2016, b=0, c=4, d=42;
    mystery(&a, &b);
    if (a < c)
        mystery(&c, &a);
    mystery(&a, &d);
    printf("%d\n", a);
}

我试图通过使用指针来交换变量的值,但我无法理解为什么即使在函数调用之后变量也包含相同的值

3 个答案:

答案 0 :(得分:4)

您需要更改指针指向的内容,而不是指针本身。

void mystery(int *ptra, int *ptrb) 
{
   int temp; //make it non-pointer also.
   temp = *ptrb;
   *ptrb = *ptra;
   *ptra = temp;
}

如果您自己更改指针,则更改将是函数的本地更改,因为变量ptraptrb是局部变量,保存地址。

一般来说,请记住,当您处理指针时,通常会涉及两个对象:

  • 指针本身
  • 指针指向的对象,即内容。

在你的情况下,你正在处理指针只有,而不是内容 - 而指针本身是通过值传递,这就是为什么改变指针的原因变量是函数的本地变量。

另外,请注意已经std::swap完成了这项工作。如果你不知道它,请改用它。

答案 1 :(得分:1)

mystery函数中,您需要使用的表示法来实际访问指针所指向的值:

*ptra

这称为解除引用指针。我对here有一个旧答案。

所以:

void mystery(int *ptra, int *ptrb) 
{
   int temp = *ptrb;
   *ptrb = *ptra;
   *ptra = temp;
}

答案 2 :(得分:0)

您没有交换指针指向的变量的值,而是交换地址。

在指针旁边使用*来使用值而不是地址。