-1

私はポインターを試していて、この例を作成しましたが、なぜこれが機能しないのかわかりません。参照せずに値を渡したときに関数がcin操作を実行しない理由を誰かが説明できますか?

#included proper headers and stuff
...
int main()
{
    int a, b;
    swap(a,b);

    cout << "A: " << a << endl;
    cout << "B: " << b << endl;
    return 0;
}

void swap(int * p1, int *p2)
{
    cin >> *p1;
    cin >> *p2;
    int temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

結果cinはスキップされますA:0 B:0

4

4 に答える 4

2

うーん。ポインターが期待される場所に整数を渡しています。このswap()関数は、これらの初期化されていない整数の (ランダムなガベージ) 値をマシン アドレスとして使用し、それらのアドレスにデータを書き込んでいます。もちろん、これはあなたが渡す整数の値を変更しません-メモリ内の他のランダムな場所を変更します。多くの場合、この種のプログラムはセグメンテーション違反でクラッシュします。あなたはただラッキー(または不運)です。

整数へのポインタを渡せばうまくいきますが、swap(&a, &b)その場合はすでに理解されていると思います。

于 2012-04-26T13:53:30.167 に答える
1

変数自体ではなく、変数のアドレスを渡す必要があります。

int a, b;
swap(&a,&b);

アンパサンドに注意してください

于 2012-04-26T13:52:17.127 に答える
0

それは実際にあるはずswap(&a,&b)です。常にポインターの参照を持っています。ポインター p1 と p2 は実際には有効な場所を参照していません。

于 2012-04-26T13:55:12.443 に答える
0

スキップしたプログラムの部分には、おそらく次の行があります。

using namespace std;

また、次の行が必要になる場合もあります。

extern void swap(int * p1, int *p2);

using宣言により、すべてのシンボルがstdスコープに取り込まれます。具体的には、 をもたらしstd::swapます。あなたが意図したものではなく、呼び出しのswap行。mainstd::swap(int&, int&)

このエラーは、独自のスワップを間違って呼び出しているという事実によって悪化します。スワップを呼び出したい場合は、a) 使用する前に宣言し、b) 正しく呼び出す必要があります。

このプログラムを試してください:

#include <iostream>
extern void swap(int*, int*);

int main()
{
    int a, b;
    swap(&a,&b);

    std::cout << "A: " << a << "\n";
    std::cout << "B: " << b << "\n";
    return 0;
}

void swap(int * p1, int *p2)
{
    std::cin >> *p1;
    std::cin >> *p2;
    int temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}
于 2012-04-26T15:28:57.900 に答える