数组的退化问题

问题描述

定义一个函数,以数组为形参,函数体内部求出数组大小如下:
结果:无论定义多大的数组,最终函数体内输出的数组大小始终为**4*
#include
void fun(char arr[]){//以数组为形参,一维数组作形参无需确定大小printf("%d\n",sizeof(arr));//输出传递过来的数组的大小
}
void main(){char arr[9];printf("%d\n",sizeof(arr));//输出实参数组的大小fun(arr);
}

原因

因为当数组作为实参进行传递时会自动**退化为指针**(是一种隐式转换),所以传入的是数组的首地址,作为
接收的形参char arr[]也会自动退化为 char *类型的指针,所以数组在进行传递时,传递的时数组的地址而不是
数组的元素。

解决方法

函数中需要数组大小时,需另声明一个形参来传递数组大小。如下:
#include
void fun(char arr[],int arrlencom){//以数组为形参,一维数组作形参无需确定大小printf("%d\n",arrlencom);//输出传递过来的数组的大小
}
void main(){char arr[9];int arrlencom;arrlencom = sizeof(arr);printf("%d\n",arrlencom);//输出实参数组的大小fun(arr,arrlencom);
}

仅在以下3种情况中,数组不会退化成指针

1.使用 sizeof(a) 的时候,所以上面 sizeof(a)(main函数中的) 的结果为9
2.对数组名取地址操作:&a,&a的类型为pointer to array of 6 chars,而对字符串指针取地址结果为
pointer to pointer to char.
3.使用字符串初始化数组时,也不会退化。
其他情况下,都会退化成”指向数组首元素的指针“(一维二维数组均是如此)

还有以下这种比较具有迷惑性

main函数中sizeof(arr + 1)中,数组也会退化成指针,arr+1,首地址+1.
void main(){char arr[9];int arrlencom,sum;sum = arr+1;arrlencom = sizeof(sum);printf("%d\n%p\n%p\n",arrlencom,arr,sum);//输出实参数组的大小fun(arr,arrlencom);
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部