2017-07-29 31 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 

在第一種情況下,它給了我們確切的數組長度,但在第二種情況下,長度是荒謬的和錯誤的。

這是因爲,該陣列被作爲函數內引用傳遞,因此,基地址在這裏通過。這就是爲什麼它會導致sizeof()運算符考慮,上面的數組中只有單個元素,因此計算大小是基於該考慮。

現在和java一樣。這裏也是數組作爲參考傳遞。 那麼「arrayname.length」屬性如何計算它的長度。像這樣,

//Java code snippet... 

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

即使在一個函數中。 你能否詳細說一下我。

+0

*「你可以詳細說明一下嗎?」 - 他們是兩種完全不相關的語言。故事結局。如果您問的是JVM如何在內部處理它,這是一個完全不同的故事(並且對於SO來說太廣泛了) – UnholySheep

+0

也不論是Java還是C都將數組作爲參考傳遞。在C中,它衰減到一個按值傳遞的指針,在Java中,數組是引用類型,並且您正在按值傳遞對該數組的引用。 – UnholySheep

+0

Java中的數組是與COD中的'std :: array'或'std :: vector'類似的對象,與POD數組不同 –

回答

2

Java數組是指嵌入(至少)長度字段和數組元素的對象。所以對數組的引用實際上是對該對象的引用,從中可以提取長度。

C數組,在另一方面,基本上縵陣列和因此沒有包括的長度字段。使用sizeof來確定長度僅適用於編譯器可以看到包含長度的聲明(除了具有特殊處理的VLA之外)的數組(而不是衰減的指針)。

2

在第二個示例中,您實際上將指針大小除以整數的大小。所以在你的系統中,指針的大小比整數長兩倍。