8

基本的な概念をクリアする必要があります。このコードは正常に動作します。関数 calDouble が既に int のアドレス (参照) を返している場合、メイン int *j = &calDouble(i); で & 演算子をさらに使用する必要がある理由を説明してもらえますか? int のアドレス (参照) を取得するには? ありがとう。

int& calDouble(int x)
{
    x = x*2;
    return x;

}

int main(int argc, char *argv[])
{
    int i = 99;
    int *j = &calDouble(i);

    system("PAUSE");
    return EXIT_SUCCESS;
}
4

2 に答える 2

3

int& calDouble(int x)はアドレスではなく、への参照を返しますint

参照をポインターに割り当てるには、参照のアドレスを取得する必要があります。

ただし、コードは未定義の動作を呼び出すことに注意してください。パラメータを値で渡すため、そのコピーが関数内に作成されます。したがって、参照によってローカル変数を返しますが、これは正当ではありません。

あなたの混乱は から来ていると思います&。これは、次の 2 つの方法で使用できます。

  • 変数に適用すると、&xそのアドレスが取得されます
  • 宣言int& xで参照を定義する場合

参照は単なるエイリアスであり、変数の別の名前です。

int x = 0;
int& y = x;

次に、同じ変数xを参照します。y

int* z = &x;

のアドレスを取りますx

于 2012-07-07T06:31:55.843 に答える
1

int&参照型です。住所ではありません。

何が機能するかを確認するに&calDouble(i)は、それを 2 つのステートメントに分割したかどうかを検討してください。

int& x = calDouble(i);
... = &x;

calDouble()関数は参照型を返し、先頭に追加されたものは、返されたもののアドレスを&取ります。したがって、タイプは nowです。これが、その行がコンパイルされる理由です。int*

ただし、プログラムは未定義の動作を示します! 関数が終了すると、xincalDouble()は消えます。元々存在していた値がまだメモリに残っている可能性があるため、プログラムが「機能する」のです。しかし、これは本番コードでは信頼できません。また、ある日、完全に機能するテスト プログラムがデプロイされた瞬間に爆発する可能性があります。

このようなさまざまな理由から、ローカル変数への参照を返すことは一般的に悪い考えです。(クラス メソッドがメンバ データへの参照を返すことがわかります。これらの変数はまだ存在するため、オブジェクトがまだスコープ内にある限りは問題ありません。) 通常の値を返してint、生活を続けてください。大きなオブジェクトを返すときのパフォーマンスが本当に心配な場合は、最適化コンパイラで戻り値の最適化を行うことができます。

于 2012-07-07T06:37:43.177 に答える