1. ホーム
  2. java

[解決済み] なぜプログラマーは、"参照渡し "は本当は "値渡し "だと言うのでしょうか?なぜそれが重要なのでしょうか?

2022-03-07 13:39:44

疑問点

Camp;C++の参照渡しと、Javaの値渡しだけの類似の概念を知っています。 しかし、観点からは、すべてが値で渡すことではありませんか? C言語では、変数のポインタを関数に渡します。C言語では、変数のポインタを関数に渡しているのだから、その参照の値を関数に渡しているに過ぎない。Javaが参照渡しをサポートしていないのは、参照変数の値を関数に渡すだけだからです。つまり、参照変数を値で渡しているのです。C++では、引数を渡して、関数が同じメモリ位置で動作するように、この形式を使用して参照渡しの方法があります。

void swap(int &x, int &y)

しかし、C言語でのポインタによる参照渡しは、ポインタを値で渡しているだけです。

void swap(int* x, int* y)

この質問は少し馬鹿馬鹿しいかもしれませんが、私が持っている概念全体に大きな穴があるように感じています。つまり、参照による呼び出しの実際の定義は何なのか、これは別の文脈での値による呼び出しのpseduoの名前に過ぎないのか?

どのように解決するのですか?

ポイントは2つです。

  • C言語では参照による呼び出しはありません。
  • 値による受け渡しと参照による受け渡しは別物です。同じではありません。

値で渡す。 呼び出された関数は、スタックに新しい変数のセットを作成し、引数の値をそこにコピーします。

参照渡しとする。 呼び出される関数に値を渡す代わりに、元の変数への参照/ポインタを渡します。

<ブロッククオート

プログラマーはなぜ、"参照渡し "は本当は "値渡し "だと言うのでしょうか?

元の変数への参照/ポインタを渡す際、実際にはオブジェクト/アドレスは値で渡されます。つまり、参照渡しは 値によって参照を渡す を意味するものではありません。 参照渡し の仮の名前です。 値で渡す . この2つの違いは、以下のサイトで説明されています。 この回答 . 抜粋してコピーしています。

<ブロッククオート

URLを教えると、私は 参照渡し。 そのURLで 同じウェブページ 見ることができる。そのページが変更されると、私たち双方がその変更を見ることができます。URLを削除しても、そのページへの参照を破棄しているだけで、実際のページそのものを削除しているわけではありません。

そのページをプリントアウトして渡せば、私は 値で渡す . あなたのページは、オリジナルから切り離されたコピーです。その後の変更は見えませんし、あなたが行った変更(プリントアウトに落書きするなど)は、オリジナルのページには表示されません。プリントアウトを破棄した場合、あなたは実際に破棄したことになります。 あなたのコピー しかし、元のウェブページは無傷のままです。