「c」では、「値渡し」または「参照渡し」で引数を渡すことができると聞きました。しかし、ある本では、引数を双方向で渡すことができると述べていますが、「参照渡し」はありませんが、実際にはほとんどの引数を「参照渡し」で渡します。
では、なぜ「Cには「参照渡し」があるのですか?
詳細な説明は非常に高く評価されます。
C パラメーターは、常に参照ではなく値によって渡されます。ただし、オブジェクトのアドレスがそのオブジェクトへの参照であると考える場合は、その参照を値で渡すことができます。例えば:
void foo(int *x)
{
*x = 666;
}
あなたはコメントで尋ねます:
では、すべてのパラメーターを値で渡すことができるのに、なぜ C でポインターが必要なのでしょうか?
値渡しのみをサポートする言語では、ポインターがないと制限されるためです。これは、次のような関数を記述できないことを意味します。
void swap(int *a, int *b)
{
int temp = *a;
*b = *a;
*a = temp;
}
たとえばJavaでは、値渡しのみでポインターがないため、その関数を作成することはできません。
C++ では、次のような参照を使用して関数を記述します。
void swap(int &a, int &b)
{
int temp = a;
b = a;
a = temp;
}
同様にC#でも:
void swap(ref int a, ref int b)
{
int temp = a;
b = a;
a = temp;
}
「参照セマンティクス」の概念は抽象的で理論的なものであり、関数にデータへの参照を与えることで、関数が既存のデータを適切に変更する方法があることを意味します。
問題は、参照セマンティクスを言語で実装できるかどうかです。C では、ポインターを使用して参照セマンティクスを取得できます。つまり、目的の動作を得ることができますが、さまざまな断片 (ポインター型、アドレス演算子、逆参照演算子、ポインターを関数引数として渡す (「値渡し」)) から自分で組み立てる必要があります。
対照的に、C++ にはネイティブの参照型が含まれているため、参照セマンティクスを直接言語に実装します。
a = b
他の言語では、これに対するアプローチが異なります。たとえば、Python では、多くのものがデフォルトで参照になっています (たとえば、リストである場合とa = b[:]
whenの間に違いb
があります)。言語が参照と値のセマンティクスを提供するかどうか、および提供する方法は、言語の設計の重要な部分です。