2012-01-24 4 views
3

私は開発を始めています、この初心者の質問についてはごめんなさい。関数の値を変更することができません

2つの変数間の値を入れ替える関数を作成する必要があります。

私はこのコードを書いていますが、ヴァarsに変更はありません。どうすれば変更できますか?私の間違いは何ですか?

#include <iostream> 
using namespace std; 

void swap_values(int x, int y); 
int main(void) { 
    int a,b;  
    a = 2; 
    b = 5; 
    cout << "Before: " << a << " " << b << endl; 
    swap_values(a,b); 
    cout << "After: " << a << " " << b << endl; 
} 
void swap_values(int x, int y){ 
    int z; 
    z = y; 
    y = x; 
    x = z; 
} 
+0

は、既存の 'のstdを使用:: swap'はオプションではありませんか? –

+0

@BoPersson、ありがとう、ただの宿題。それを理解する。 – CrazyHorse

答えて

10

あなたは、参照によって変数を渡す必要があります。

void swap_values(int& x, int& y) 
{ 
    int z; 
    z = y; 
    y = x; 
    x = z; 
} 

pass-by-valuepass-by-referenceは、主要なプログラミング言語で重要な概念です。 C++では、参照で指定しない限り、pass-by-valueが発生します。

基本的には、関数に渡される元の変数ではなく、コピーされていることを意味します。

これは、関数内で変数が同じであるため、関数内ではコピーのみが変更されたためです。

参照渡し(int& x, int& y)の場合、この関数は元の変数に作用します。

+0

ありがとうございました。私の先生は 'void swap_values(int * x、int * y)'について話します。これはどういう意味ですか?約15K Rをおめでとうございます! – CrazyHorse

+0

これはポインタを渡しています。これは基本的に同じ結果ですが、参照渡しのように、変数自体の代わりに変数のアドレスを関数に渡す必要があるだけです。アドレスを渡すことで、関数内の同じメモリで作業するので、ポインタ**が指し示す**メモリへの変更は、ポインタ自体ではなく、関数外で反映されます。 –

+0

@CrazyHorseまた、15kではなく、私は14960 :)、ちょうど数を切り上げます。 –

0

値渡しです。値渡しはできますが、ポインタで作業する必要があります。また

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

void main() { 
    int a = 23, b = 47; 
    printf("Before. a: %d, b: %d\n", a, b); 
    swap(&a, &b); 
    printf("After . a: %d, b: %d\n", a, b); 
} 

VS「値によって」「参照によって」説明小さな文書:http://www.tech-recipes.com/rx/1232/c-pointers-pass-by-value-pass-by-reference/

+1

参照渡すためのポインタは必要ありません、私の答えを参照してください。また、あなたのスニペットは参照渡しではありません。また、値渡しのポインタだけを渡します。 –

+2

これは参照渡しとほぼ同じですが(つまり、同じ効果が得られます)、これは変数へのポインタの値渡しです。 – rubenvb

+1

これは参照渡しではありません。 – Marcin

1

デフォルトでは、C++が使用することをあなたが理解する必要があり、ここで

は必要な正しいコードですコールバイバリューの呼び出し規約。

swap_valuesを呼び出すと、そのスタックフレームは、パラメータとして渡された値のコピーを受け取ります。したがって、パラメータint x, int yは発信者から完全に独立しており、変数int a, bです。

幸いなことに、C++は関数の変数(または別名)にバインドされていることを本質的に意味する、参照による呼び出し(wikipediaまたはその優れたプログラミング言語の教科書を参照)呼び出し元の変数(これは総称して簡素化されています)。

参照による呼び出しの構文は次のとおりです。

void swap_values(int &x, int &y){ 
    // do your swap here 
} 
+0

Downvoter:コメントしますか? – Marcin

+1

いいえ、私には正しい考えです。たぶんデフォルトではないので、C++では値の呼び出し規約で "デフォルトでは問題がありました"ので、渡されるすべてのパラメータを明示的に指定する必要があります。しかし、これはあまりにも賢明すぎるIMOのdownvoteの理由です。 –

+0

@SethCarnegie:私はランダムなダウン・ダウン者を呼びたい。 – Marcin

関連する問題