3 回答

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

TA贡献1851条经验 获得超4个赞
正如其他答复者所指出的,声明为采用数组的函数的编译方式与采用指针的方式相同。
我见过的最常见的长度方法是使用#define,但是如果您使用模板玩弄技巧,则可以使函数起作用。
template <size_t _Size> inline int length(int(& array)[_Size])
{
//return sizeof(array) / sizeof(int);
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));
// error C2784: 'int length(int (&)[_Size])' : could not deduce template
// argument for 'int (&)[_Size]' from 'int *'
// test.cpp(56) : see declaration of 'length'

TA贡献1816条经验 获得超6个赞
在主程序中,编译器知道数组的长度。在子例程中,没有。特别地,在子例程中,type int[]
的参数与type的参数相同int *
。另一方面,在主程序中,array
具有type int[4]
。(您可以通过尝试向array
in 分配另一个值来进行测试main
。编译器会抱怨。)
- 3 回答
- 0 关注
- 487 浏览
添加回答
举报