数组的退化问题
作者:互联网
问题描述
定义一个函数,以数组为形参,函数体内部求出数组大小如下:
结果:无论定义多大的数组,最终函数体内输出的数组大小始终为**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);
}
标签:arrlencom,char,arr,问题,退化,数组,printf,sizeof 来源: https://blog.csdn.net/qq_45860879/article/details/119462987