0

質問する前に、私は次のことを知っていることに注意します。

  1. Cでは、メソッドを値でも参照でも呼び出すことができます
  2. Java では、値によってのみメソッドを呼び出すことができます (オブジェクトを渡す場合、オブジェクト参照自体ではなく、オブジェクト参照の値を渡します)。
  3. 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);
4

5 に答える 5

4

はい、パラメータを追加するか、クラスint offを使用してください。IntBuffer

void foo(int[] a,int off, int l) {
 ...
 System.out.printf("%d", a[off];  //prints 1
 ...
 ...
}

f(a,2,l);


void foo(IntBuffer a,int l){
   System.out.printf("%d",a.get(0));
}
IntBuffer buffer = IntBuffer.wrap(a,2,a.length-2);
foo(buffer,l);
于 2012-06-19T18:56:51.850 に答える
1

のようにポインター演算を実行して配列の要素をアドレス指定できるかどうかについての質問であればarr + 2、答えはノーです。

ただし、配列と配列の読み取りを開始する位置を渡すことで、同じ効果を得ることができます。

于 2012-06-19T18:51:46.263 に答える
1

Java の配列の基になる構造には、その長さを示す余分な要素が先頭にあります。したがって、元の配列は{len, 1, 2, 3, 4, 5}JVM によって保存されたものになります。これは、配列に対するインデックス操作から Java を「安全」に保つために行われます。これにより、Java でポインター演算を実行することもほとんど不可能になります。

Java でこのようなことを行うには、通常、ある種のBufferクラスを使用して配列をラップします。

于 2012-06-19T18:52:26.437 に答える
0

Java にはネイティブのスライス関数がありません (配列の開始に関して C にある暗黙的な関数や、最近のいくつかの言語にある明示的な関数など) が、配列、インデックス、および長さをラップする独自のクラスを簡単に構築できます。君はそれが要る。

于 2012-06-19T18:50:05.300 に答える
0

C と Java で配列を渡すときの考え方は同じです。

Java では、オブジェクトに渡されるのはオブジェクトへの参照、つまりポインターだけです。Java では、A *a = new A(); とは決して言いません。A a = new A(); と書くだけです。*がないのが違いです。それ以外の場合、 A はポインターとまったく同じように動作します。

プリミティブ変数は値渡しです。

于 2012-06-19T18:50:21.823 に答える