数组的退化问题

问题描述

定义一个函数,以数组为形参,函数体内部求出数组大小如下:
结果:无论定义多大的数组,最终函数体内输出的数组大小始终为**4*
#include<stdio.h>
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<stdio.h>
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);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值