为什么sizeof(param_array)是指针的大小?

我想得到一个数组的长度,比如说int array[] = {1, 2, 3, 4}。我曾经sizeof那样做。


int length(int array[])

{

     return sizeof(array) / sizeof(int);

}


int main()

{

    int array[] = {1, 2, 3, 4};

    printf("%d\n", length(array)); // print 1

    printf("%d\n", sizeof(array) / sizeof(int)); // print 4

}

那么,为什么sizeof(array)in函数length返回指针大小array?但是在功能上main,它起作用。


而且,如何修改length函数以获取数组的长度?


湖上湖
浏览 488回答 3
3回答

慕标5832272

一条特殊的C规则表示,对于函数参数,数组类型将调整为指针类型。这意味着:int length(int array[]);相当于int length(int *array);因此,当您计算sizeof数组时,实际上是在计算指针的大小。(C99,6.7.5.3p7)“参数声明为“类型数组”应调整为“类型的合格指针”,其中类型限定符(如果有)是在数组的[和]中指定的类型推导。”

繁花不似锦

正如其他答复者所指出的,声明为采用数组的函数的编译方式与采用指针的方式相同。我见过的最常见的长度方法是使用#define,但是如果您使用模板玩弄技巧,则可以使函数起作用。template <size_t _Size> inline int length(int(& array)[_Size]){&nbsp; &nbsp; //return sizeof(array) / sizeof(int);&nbsp; &nbsp; return _Size;};int array[] = {1, 2, 3, 4};printf("%d\n", length(array)); // print 4对于长度为4的数组,此方法将被编译为采用长度为4的数组并返回静态4的方法。这还具有以下优点:如果尝试传递非数组的内容,则编译器将给出错误,而#define方法则没有。int* foo = array;printf("%d\n", length(foo));&nbsp;&nbsp; &nbsp; // error C2784: 'int length(int (&)[_Size])' : could not deduce template&nbsp; &nbsp; //&nbsp; &nbsp; &nbsp;argument for 'int (&)[_Size]' from 'int *'&nbsp; &nbsp; // test.cpp(56) : see declaration of 'length'

潇湘沐

在主程序中,编译器知道数组的长度。在子例程中,没有。特别地,在子例程中,type&nbsp;int[]的参数与type的参数相同int *。另一方面,在主程序中,array具有type&nbsp;int[4]。(您可以通过尝试向arrayin&nbsp;分配另一个值来进行测试main。编译器会抱怨。)
打开App,查看更多内容
随时随地看视频慕课网APP