Java教程

数组的退化问题

本文主要是介绍数组的退化问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

问题描述

定义一个函数,以数组为形参,函数体内部求出数组大小如下:
结果:无论定义多大的数组,最终函数体内输出的数组大小始终为**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);
}
这篇关于数组的退化问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!