0

我正在尝试int在下面的程序中使用对指向 like 的指针的引用。但我没有得到预期的输出。

输出:

9 5
5 9

期待:

9 5
9 5

代码:

#include <iostream>
using namespace std;

void swap (int *& a, int *&b)
{
    int *t = a;
    a = b;
    b = t;
}

int main()
{
    int a = 5, b = 9;       
    int *p = &a;
    int *q = &b;

    swap (p, q);
    cout << *p << " " << *q << endl;
    cout << a << " " << b << endl;

    return 0;
}

为什么我的期望是错误的?我认为引用只是目标变量的另一个名称。

4

5 回答 5

2

您交换指针,而不是值。你的期望是错误的。

于 2013-04-12T11:37:20.897 回答
1

您正在交换指针的值。

看这个插图:

首先,p是指着aq是指着b

  p         a
+---+     +---+
+ ------> | 5 |
+---+     +---+

  q         b
+---+     +---+
+ ------> | 9 |
+---+     +---+

交换p和后q,q指向a, 并且p指向b:

  q         a
+---+     +---+
+ ------> | 5 |
+---+     +---+

  p         b
+---+     +---+
+ ------> | 9 |
+---+     +---+

但两者a仍然b有它们的旧价值观。

于 2013-04-12T12:41:39.993 回答
0

我认为引用只是目标变量的另一个名称

是的,在您的情况下,目标变量是变量的指针,而不是变量。因为您*在函数声明中使用。然后,您交换的是指针而不是值。

使用以下方法之一:

void swap(int &a, int &b)
{
    int t=a;
    a=b;
    b=t;
}
// ...

int a=5,b=9;        
swap(a,b);

或者

void swap(int *a, int *b)
{
    int t=*a;
    *a=*b;
    *b=t;
}
// ...

int a=5,b=9;        
swap(&a,&b);
于 2013-04-12T11:48:54.377 回答
0

通常,您交换的是两个指针,而不是它们指向的指针。

当您调用值 a 和 b 时,您的函数可能会让您感到困惑。您的函数交换两个指针,这样第一个指针现在指向第二个指向的位置,第二个指向第一个指向的位置。

p以前指向aqto b。现在p指向bq指向a因此您的输出为 9 5 5 9

swap您的函数中有引用。这些是对指针的引用,因此在函数范围内, aandb成为传入参数的别名,即pqand 从而修改pand q(指向别处)。

于 2013-04-12T11:38:35.597 回答
0

在您的情况下,您正在交换指针(而不是值)。由于您正在交换指针,因此内部的实际ab保持不变。因此,为什么当您打印 的值时a,您会得到5,而当您打印时,b您会得到9

于 2013-04-12T11:38:57.423 回答