2017-07-29 4 views
-2

私がJavaで学んだことは、配列が参照として渡されることです。 つまり、ポインタはJavaで内部的に使用されます。JVMはどのようにArrayName.lengthプロパティを使用して配列の長さを計算できますか?

Cでは、関数内で配列を渡すと、参照渡しされるので、sizeof()演算子を使ってサイズを計算できないのです。このように、

第一の場合: - >

#include<stdio.h> 

int main(int argc, char** argv) { 

int array[5]; 
printf("size of the array is: %lu\n", sizeof(array)/sizeof(int)); 

return 0; 
} 

と出力がされます

size of the array is: 5 

第二の場合: - >

#include<stdio.h> 

void calculate_size(int *); 
int main(int argc, char** argv) { 

int array[5]; 
calculate_size(array); 

return 0; 
} 

//Function definition... 
void calculate_size(int p[]) { 

printf("size of the array is: %lu\n", sizeof(p)/sizeof(int)); 

} 

と出力が

です
size of the array is: 2 

最初のケースでは配列の正確な長さが与えられていますが、2番目のケースでは長さは不合理で間違っています。

これは、配列が関数内で参照として渡されるため、ここでベースアドレスが渡されるからです。そのため、sizeof()演算子は、上記の配列には単一の要素しかなく、サイズはその考慮に基づいて計算されることを考慮する必要があります。

同じことがjavaになります。ここでも配列は参照として渡されます。 "arrayname.length"プロパティは、それがどのように長さを計算するのですか?このように、

//Java code snippet... 

int array[10]; 
System.out.println("Length of the array is "+array.length); 

関数内であっても。 それを私に詳しく説明できますか?

+0

*「あなたはそれを私に詳しく説明できますか?」 - 2つの完全に無関係の言語です。物語の終わり。 JVMが内部的にどのようにそれを処理するかを尋ねるならば、それはまったく別の話です(そしてSOには広すぎます) – UnholySheep

+0

また、JavaとCのどちらも参照として配列を渡しません。 Cでは、値渡しのポインタに崩壊します。Java配列は参照型で、配列への参照を値渡ししています。 – UnholySheep

+0

Javaの配列はPOD配列とは異なり、C++の 'std :: array'や' std :: vector'のようなオブジェクトです –

答えて

2

Java配列は、少なくとも長さフィールドと配列要素を埋め込んだオブジェクトです。したがって、配列への参照は実際にそのオブジェクトへの参照であり、そこから長さを抽出することができます。

C配列は本質的に未装飾の配列なので、長さフィールドは含まれません。 sizeofを使用して長さを決定するのは、コンパイラが長さを含む宣言を見ることができる配列(壊れたポインタではない)に対してのみ機能します(特別な処理を持つVLAは例外です)。

2

2番目の例では、実際には、ポインタのサイズを整数のサイズで割ります。したがって、あなたのシステムでは、ポインタのサイズは整数より2倍長くなります。

関連する問題