18

ポインターを交換する関数に取り組んでいますが、これが機能しない理由がわかりません。スワップ関数で r と s を出力すると、値がスワップされます。これにより、p と q の参照によって渡すため、理解できないコピーを操作していると思われます。

void swap(int *r, int *s)
{
    int *pSwap = r;
    r = s;
    s = pSwap;
    return;
}

int main()
{
    int p = 7;
    int q = 9;  
    swap(&p, &q);
    cout << "p = " << p << "q= " << q << endl;
    return 0;
}

プリント: p = 7q = 9

4

6 に答える 6

24

関数内swapでは、ポインターの方向を変更するだけです。つまり、ポインターが指すオブジェクトを変更します (ここでは、具体的にはオブジェクトのアドレスpq)。ポインターが指すオブジェクトはまったく変更されません。

直接使用できますstd::swap。または、スワップ関数を次のようにコーディングします。

void swap(int *r, int *s)
{
   int temp = *r;
   *r = *s;
   *s = temp;
   return;
} 
于 2013-03-28T01:54:57.930 に答える
1

この行r=sは、ポインターrのコピーをポインターのコピーに設定していますs

代わりに (std:swap を使用したくない場合)、これを行う必要があります。

void swap(int *r, int *s)
{
    int tmp = *r;
    *r = *s;
    *s = tmp;
}
于 2013-03-28T01:57:42.143 に答える
1

ポインターではない値への参照を渡しました。そのため、コンパイラは一時的な を作成(int*)し、それらを関数に渡します。

pandが何であるかを考えてみてくださいq: それらは変数です。つまり、メモリ内のどこかに割り当てられたスロットです (スタック上ですが、ここでは重要ではありません)。「ポインタの交換」についてどのような意味で話せますか? スロットのアドレスを交換できるわけではありません。

できることは、実際のアドレスを保持する 2 つのコンテナーの値を交換することです。これらはポインターです。

ポインターを交換する場合は、ポインター変数を作成し、それらを関数に渡す必要があります。

このような:

int p = 7;
int q = 9;

int *pptr = &p;
int *qptr = &q;
swap(pptr, qptr);
cout << "p = " << *pptr << "q= " << *qptr << endl;
return 0;
于 2013-03-28T02:07:34.730 に答える
0

あなたの例では参照渡しではありません。このバージョンは参照渡しです。

void swap2(int &r, int &s)
{
    int pSwap = r;
    r = s;
    s = pSwap;
    return;
}

int main()
{
    int p = 7;
    int q = 9;
    swap2(p, q);
    cout << "p = " << p << "q= " << q << endl;
    return 0;
}

参照による受け渡しは、値またはポインターによる受け渡しと同じではありません。説明については、Web 上の C++ チュートリアルを参照してください。私の脳は小さすぎて、ウェブ上で簡単に見つけることができる詳細を保存している細胞を浪費することはできません。

于 2013-03-28T02:19:54.103 に答える