C では、ポインター パラメーターと参照パラメーターの概念が混乱を招くことがよくあります。この記事では、特定の条件下での機能の同等性に重点を置きながら、関数パラメーターとしてポインターと参照を使用する場合の微妙な違いを説明します。
ポインターと参照の主な違いは次のとおりです。彼らの意味論では。ポインタは別の変数のメモリ アドレスを格納する変数であり、参照は既存の変数のエイリアスまたはシノニムです。この違いは、次のようないくつかの点で現れます。
ポインタは、それが指すデータの明示的な所有権を持ちます。これらは、別のメモリ位置を指すように再割り当てしたり、nullptr に設定したりすることもできます。一方、参照は、参照先のデータを明示的に所有しません。参照が初期化されると、別のオブジェクトに再割り当てすることはできません。
ポインタには、有効なメモリ位置を指していないことを示す NULL 値を割り当てることができます。参照には常に存在する必要がある変数のエイリアスであるため、NULL を割り当てることはできません。
ポインターのアドレスを取得すると、ポインター変数自体のアドレスが取得されます。参照のアドレスを取得すると、参照されているオブジェクトのアドレスが取得されます。
それらの違いにもかかわらず、ポインタ パラメータと参照パラメータは機能的に同等です。特定のシナリオでは同等です。最も注目すべき例は、コード例の someInt() メソッドが仮想ではない場合です。この場合、オブジェクトがポインタとして渡されるか参照として渡されるかに関係なく、両方の関数は基本的に同じオブジェクト上の同じメソッドを呼び出します。
ただし、someInt() が仮想宣言されている場合、呼び出される関数は仮パラメータが基本クラス バーへのポインタであっても、渡されるオブジェクトの実際の型に依存します。これは、基本クラスに参照を渡しても、渡されるオブジェクトの動的型が変更されないためです。
コード スニペット:
bar& ref = *ptr_to_bar;
ptr_to_bar が指すオブジェクトを参照する参照 ref を作成します。これが可能なのは、ポインター演算子 (*) がポインターを逆参照し、ポインターが指すオブジェクトを返すためです。その結果、ref と *ptr_to_bar は同じオブジェクトのエイリアスになります。
以上がポインターと参照パラメーターが C で機能的に同等になるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。