2

次の値による呼び出しの例では、このコードが5の値を6に変更しない理由を理解できません。

11行目は値6の関数changeValueを呼び出しているので、6を出力する必要があると思いますが、5は出力されますか?

#include <iostream>
using namespace std;

void changeValue(int value);

int main()
{
  int value = 5;
  changeValue(value);

  cout << "The value is : " << value << "." << endl;

  return 0;
}

void changeValue(int value)
{
  value = 6;
}

// This doesn't change the value from 5 to 6. 5 is output?
4

6 に答える 6

9

関数の引数を値で渡すと、オブジェクトのコピーが元のオブジェクトではなく関数に渡されます。明示的に指定しない限り、関数の引数は常にC /C++では値で渡されます。

あなたの機能:

void changeValue(int value)

引数を値で受け取ります。つまり、inのコピーvaluemain()作成されて関数に渡され、関数はvalueinではなくその値で動作しますmain()

オリジナルを変更する場合は、参照渡しを使用する必要があります。

void changeValue(int &value)

これで、元の参照(エイリアス)がvalue関数に渡され、関数が関数を操作して、の変更を反映しmain()ます。

于 2012-06-09T09:02:32.530 に答える
1

現在観測されている動作は、値渡しが値のコピー (値の値を持つ新しい整数) が実際に関数に渡されることを意味するためです。

参照渡しする必要があります。そのため、changeValue 関数は次のようになります。

void changeValue(int& value)

コードの残りの部分は同じままです。

参照によって変数を渡すということは、int value宣言されたものと同じものが関数mainに渡されることを意味しchangeValueます。

または、ポインターを関数に渡すこともできvalueますchangeValue。ただし、関数の呼び出し方法も変更する必要があります。

int main()
{
    int value = 5;

    changeValue(&value);

    ...

    return 0;
}

void changeValue(int* value)
{
    *value = 6;
}
于 2012-06-09T09:03:18.170 に答える
1

関数に渡す値が関数のスタック フレームにコピーされてから変更され、関数が終了するとコピーが破棄されるため、の値valueは変更されません。元の のスタックフレームは にコピーされたため、変更されていません。intmainchangeValue

変更したい場合はint、 so のように への参照を渡す必要がありますvoid changeValue(int& value)。これは、値が関数にコピーされず、元のエイリアスが渡されるだけであることを示しています。

于 2012-06-09T09:03:55.710 に答える
1

関数を記述し、パラメーターを値で渡すことについて考える別の方法として、この回答を含めています。

このコードを次のように記述することもできます。つまり、パラメーターを値で渡し、元の値を変更せずに関数内のローカル コピーを変更し、変更された値を返します。

int changeValue(int val)
{
  val = 6;
  return val;
}

int main()
{
int value = 5;

value = changeValue(value);

cout << "The value is : " << value << "." << endl;

return 0;
}

あなたのプログラムに対する私の提案が参照渡しよりも優れていることを示すつもりはありません。代わりに、関数型プログラミング言語 (Clojure) の学習が私の考え方に影響を与えているのと同じです。

また、Python などの言語では、スカラー パラメーターを変更できません。新しい値のみを返すことができます。したがって、私の答えは、C/C++ で物事を異なる方法で考えることの演習です。

于 2012-06-09T13:26:34.430 に答える
0

と:

コピーには 6 が割り当てられますが、変更は返されません。

値を変更する場合は、参照またはポインターが必要です。

次のようなメソッド シグネチャを使用してみてください。

void changeValue(int& value)

それはおそらくあなたが期待したことをするでしょう

于 2012-06-09T09:04:52.903 に答える
0

これは、changeValue ()関数の変更がローカルであるためです。可能な場合、mainchangeValue (value)の変数の内容は、関数の (同じ名前の)valueという名前の仮引数にコピーされます。value同じ名前は、両方が同じという意味ではありません。関数内でアクセスしている値は、メインにあった値のコピーです。

変更するには、参照またはポインターで渡す必要があります

void changeValue (int *val)
{
  *val = 6;
}

changeValue (&value)メインで呼び出す

これはvalue、メインの変数のアドレスが渡され、このアドレス値が関数にコピーされるvalため機能します。を実行*valすることで、 にコピーされたアドレスの内容を取得できます。これはval、実際にvalueは main の内容です。

また

void changeValue (int &val)
{
  val = 6;
}
于 2012-06-09T09:04:54.050 に答える