2016-11-22 14 views
0

ポインタを使用していないことに注意してください。しかし、この関数を使用すると、コードブロックが終了したときに値が通常に戻ります。スワップ関数 - ポインタ - 混乱

しかし、コードは私が実際にポインタで得る答えでコンパイルしています。

私はポインタに関連するファウルコンセプトを持っていると混乱しているので、私は助けが必要です。

void swap(int i, int j) { 
    int temp = i; 
    i = j; 
    j = temp; 
} 

int main() { 
    int a = 110; 
    int b = 786; 
    cout << "Before swapping the value" << endl; 
    cout << "'a' stores the value : " << a << endl; 
    cout << "'b' stores the value : " << b << endl; 
    swap(a,b); 
    cout << "\nAfter swapping the value" << endl; 
    cout << "'a' stores the value : " << a << endl; 
    cout << "'b' stores the value : " << b << endl; 
    swap(a, b); 
    cout << "\nAnd back again swapping the value" << endl; 
    cout << "'a' stores the value : " << a << endl; 
    cout << "'b' stores the value : " << b << endl; 

    return 0; 
} 

I am getting results without using pointers - is this IDE problem

+2

でプログラムの実際の出力とは何ですか?どのようなアウトプットを期待しましたか?あなたの質問を編集してください。 –

+0

あなたがあなたのargをコピーし、それらに新しい価値を割り当てないという意味で渡しているように、これはうまくいかないので、 – EdChum

+0

おそらく、マクロを使ってスワップしようとしています: '#define swap(i、j)do {int temp = i; i = j; while(0) ' – GPS

答えて

3

iostreamヘッダーには、utilityヘッダーも含まれているようです。あなたのプログラムにはstd::swapの定義が含まれています。

コードにusing namesapce std;があるので(表示しないでください)、swapのオーバーロードセットには両方のオーバーロードが含まれています。そして、過負荷解決のルールによって、正確なが呼び出されます。正しいのいくつかの定義について


、この場合

+0

関数名を変更して確認します –

+0

Visual Studio 2013で 'iostream 'ヘッダと' using namespace std; '私はOPの問題を再現できません。予想される動作であるスワップは機能しません。 – Philipp

+0

@Philippでは、標準がそれを保証しない限り(この場合はそうではない)、標準ヘッダに他のヘッダを含めることはできません。 [GCCはそれを再現します](http://ideone.com/k19F60)。 – StoryTeller

6

ij機能ローカル変数あるので、あなたのswap機能は、mainの範囲で値を交換しません。期待する振る舞いを得るには、参照渡しする必要があります。

void swap(int& i, int& j) { 
    int temp = i; 
    i = j; 
    j = temp; 
} 

コードはnot actually swap the valuesとなります。

推測
は、私はあなたがusing namespace std;、あなたがstd::swapと衝突している標準ライブラリからのご#includeのいずれかからだと思います。私は、std::関数のバージョンがあなたのケースで呼び出されていると思う、それはあなたのコードが "働く"ように見える唯一の理由です。あなたが交換するためにポインタを使用したい場合は

+0

それは、ポイントは、ここにコンパイル後の画像です - それは私に完全な答えを与える - http://imgur.com/a/qc8jP –

+0

@BaqarHussain私の編集を参照してください。 – CoryKramer

0

、あなたはポインタで渡す必要があります:別のユーザーが指摘したよう

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

参照渡し

は、別のオプションです。

PS:クエリは関数ポインタとは関係がないため、クエリから関数ポインタタグを削除します。

+0

申し訳ありませんが、私はこの部分を見落としました。 –

+0

私はこれを普通に使っていましたが、好奇心のせいでポインタを削除してスワップされた値になってしまったのです。 –