JVM如何使用ArrayName.length属性计算数组长度?

时间:2017-07-29 08:19:24

标签: java c

从我在Java中学到的是,Arrays作为参考传递。 这意味着指针在java内部使用。

在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

第二种情况: - &gt;

#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一样。这里也将数组作为参考传递。 然后怎么做&#34; arrayname.length&#34;属性计算它的长度。像这样,

//Java code snippet...

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

即使在函数内部也是如此。 你能详细说明一下吗。

2 个答案:

答案 0 :(得分:2)

Java数组是对象,它嵌入(至少)长度字段和数组元素。因此,对数组的引用实际上是对该对象的引用,可以从中提取长度。

另一方面,C数组基本上是非数字数组,因此没有包含长度字段。使用sizeof来确定长度仅适用于数组(而不是衰减指针),编译器可以在其中查看包含长度的声明(除了具有特殊处理的VLA之外)。

答案 1 :(得分:2)

在第二个示例中,您实际上将指针大小除以整数的大小。所以在你的系统中,指针大小比整数长两倍。

相关问题