質問する前に、私は次のことを知っていることに注意します。
- Cでは、メソッドを値でも参照でも呼び出すことができます
- Java では、値によってのみメソッドを呼び出すことができます (オブジェクトを渡す場合、オブジェクト参照自体ではなく、オブジェクト参照の値を渡します)。
- C と Java のコンテキストでは、ポインターと参照の間に違いがあります。
今質問に:
配列を考えてみましょう:
arr = {1,2,3,4,5} //len =5
C では、次の 2 つのことを実行できます。
foo(arr, len);
bar (arr+ 2, len -2);
関数定義:
foo(int *a, int l) {
...
printf("%d", &a[0]; //prints 1
...
}
bar (int *a, int l){
printf("%d", &a[0]; //prints 3
...
}
関数 bar の配列 a が arr[2] (元の配列) のアドレスを含むため、値 3 で始まることがわかります。サブ配列を開始インデックス 0 の新しい配列として扱いたい場合、これは C で配列を渡すための巧妙な方法です。
次の呼び出しがCとJavaで異なる意味を持っているにもかかわらず、Javaで同じことが達成できるかどうか疑問に思っていました:
foo(arr);