从我在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);
即使在函数内部也是如此。 你能详细说明一下吗。
答案 0 :(得分:2)
Java数组是对象,它嵌入(至少)长度字段和数组元素。因此,对数组的引用实际上是对该对象的引用,可以从中提取长度。
另一方面,C数组基本上是非数字数组,因此没有包含长度字段。使用sizeof
来确定长度仅适用于数组(而不是衰减指针),编译器可以在其中查看包含长度的声明(除了具有特殊处理的VLA之外)。
答案 1 :(得分:2)
在第二个示例中,您实际上将指针大小除以整数的大小。所以在你的系统中,指针大小比整数长两倍。