0

以下のプログラムで、ポインタへの参照を使用しようとしていますint。しかし、期待される出力が得られません。

出力:

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おり、は を指しています: qqapb

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

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

しかし、両方ともaまだb古い値を持っています。

于 2013-04-12T12:41:39.993 に答える
0

一般に、2 つのポインターを交換していて、それらが指しているものではありません。

値 a と b を呼び出しているため、関数が混乱している可能性があります。関数は 2 つのポインターを交換して、最初のポインターが 2 番目のポインターが指していた場所を指し、2 番目のポインターが最初のポインターが指していた場所を指すようにします。

pa以前はとqを指していましたb。をポイントpbqポイントするaため、出力は 9 5 5 9 です

関数に参照がありますswap。これらはポインターへの参照であるためab関数スコープ内では渡されたパラメーターのエイリアスにpなります。qpq

于 2013-04-12T11:38:35.597 に答える
0

あなたの場合、ポインタを交換しています(値ではありません)。ポインターを交換しているため、内部の実際のaと変更されbていません。したがって、 の値を印刷するとaが得られ5、印刷bすると が得られるのはなぜですか9

于 2013-04-12T11:38:57.423 に答える
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 に答える