2016-05-17 10 views
0

まだ一般的なプログラミングのnoob。私はこのコードは動作しませんが、なぜですか?ポインタを使用してこのスワップ関数に問題がありますか?

void swap(int num1, int num2) 
{ 
    int* p_first =& num1; 
    int* p_sec =& num2; 
    *p_first = num1; 
    *p_sec = num2; 
} 
+0

'void swap(int&num1、int&num2)'または 'void swap(int * num1、int * num2)'とする必要があります。パラメータはそのままで、コピーで渡され、参照やポインタは渡されないので、整数のローカルコピーをスワップします。 SOとインターネットには多くの例があります。 – Brandon

+2

関連する、実際には、これはどこからでも 'std :: swap 'にする必要があります。あなたが学問的にそうしなければ車輪を再発明する必要はありません。 – WhozCraig

+0

理由がわからない場合は、コードが機能しないことをどのように知っていますか? 「働かない」というあなたの定義は何ですか?何が起こったのか、何が起こるのかなど、最小限の例を抽出する必要があります。 –

答えて

2

関数は、関数のみnum1num2の一時的なコピーの上で動作していることを意味し、値で引数を取ります。関数はそれらの値を変更し、それが戻ったときに一時的な値を破棄し、変更されていない実際の値が保持されます。

これを修正するための慣用的なC++の方法は、値の代わりに参照による引数の受け渡しです。

void swap(int &num1, int &num2) { 
    auto temp = num1; 
    num1 = num2; 
    num2 = temp; 
} 

int x = 5, y = 7; 
swap(x, y); 

また、ポインタで引数を渡すこともできます。これはそれを行うための慣用的なCの方法です(Cには参照がありません)。不利な点は、呼び出し側のコードが引数そのものではなく引数のアドレスを渡すことです。もちろん

void swap(int *num1, int *num2) { 
    int temp = *num1; 
    *num1 = *num2; 
    *num2 = temp; 
} 

int x = 5, y = 7; 
swap(&x, &y); 

、2つの数値を交換するために、最善の方法は、車輪の再発明し、代わりにすでにのために書かれstd::swapを、使用しないことです。

int x = 5, y = 7; 
std::swap(x, y); 
1

あなたの関数は何もせず、出力なしの関数のようです。

理由は次のとおりです。 num1num2はあなたにも変数をスタックしているp_firstp_secに自分のアドレスを割り当て、スタック変数です。スタック変数のアドレスは、コードを実行するたびに変更されます。

num1num2を交換する理由は、他の2つの変数に値を割り当てた理由(意味がありません)です。あなたはこの

void swap(int num1, int num2) 

のように宣言した場合ので、あなたが使用する必要が

temp = num1 
num1 = num2 
num2 = temp 

をし、C++はちょうどパス値が機能するようになりますので:

少なくとも、あなたはそれらを交換するために、このように考える必要がありますポインタまたは参照を使用します(詳細な実装は簡単に検索できます)。

void swap(int* num1, int* num2) //pointer parameter 
void swap(int& num1, int& num2) //reference parameter 
-2

1 - ここでスワップ関数では値による呼び出しを使用しているため、呼び出し元関数で結果を戻すことはできません。

2 - 下記の機能を実装する - >

void swap(int num1, int num2) { 
    int temp; 
    int* p_first =&num1; 
    int* p_sec =&num2; 
    temp = *p_first; 
    *p_first = *p_sec; 
    *p_sec = temp; 
    printf("\n %d %d \n",num1,num2); 
} 

スワップは現在動作します。

+0

私は有権者ではありません。コードはひどいです。あなたは 'スワップ'機能がコンソールI/Oを行うことを期待していますか? 'printf'ですか?これは 'strlen'のようにコンソール上の文字列の長さを出力として出力し、戻りません。 – Ajay

+0

上記の理由から、私はdownvoterです。あなたの 'swap'はコピーを取ります。ポイントは何ですか?誰が関数を呼び出して2つの値を渡し、それらの値を別の順序で出力させたいのですか?等価な関数は 'void swap(int n1、int n2){std :: cout << n2 << >><< n1 << std :: endl};です。 – Tas

関連する問題