为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
湖上湖 2019-11-04 11:03:38
我想得到一个数组的长度,比如说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函数以获取数组的长度?
查看完整描述

3 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

一条特殊的C规则表示,对于函数参数,数组类型将调整为指针类型。这意味着:


int length(int array[]);


相当于


int length(int *array);


因此,当您计算sizeof数组时,实际上是在计算指针的大小。


(C99,6.7.5.3p7)“参数声明为“类型数组”应调整为“类型的合格指针”,其中类型限定符(如果有)是在数组的[和]中指定的类型推导。”


查看完整回答
反对 回复 2019-11-04
?
繁花不似锦

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'


查看完整回答
反对 回复 2019-11-04
?
潇湘沐

TA贡献1816条经验 获得超6个赞

在主程序中,编译器知道数组的长度。在子例程中,没有。特别地,在子例程中,type int[]的参数与type的参数相同int *。另一方面,在主程序中,array具有type int[4]。(您可以通过尝试向arrayin 分配另一个值来进行测试main。编译器会抱怨。)


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 487 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号