char** fun1(char **arr, int x, int y)
{/*THE SAME CODE IN EACH FUNCTION */};
char** fun2(*arr[], int x, int y);
{/*THE SAME CODE IN EACH FUNCTION */};
char** fun3(arr[][], int x, int y);
{/*THE SAME CODE IN EACH FUNCTION */};
char** fun4(arr[][10], int x, int y);
{/*THE SAME CODE IN EACH FUNCTION */};
int main()
{
int arr[5][10]
char** x,y,z,v;
x=fun1(arr,5,10);
y=fun2(arr,5,10);
z=fun3(arr,5,10);
v=fun4(arr,5,10);
return 0;
}
这些功能有什么区别吗?特别是我需要知道fun4是否与其他细节有所不同。
答案 0 :(得分:0)
假设您将char
放在每个参数的开头,以便他们完全解析,这就是他们的意思:
fun1
有char **arr
作为第一个参数。这被读作“arr
是指向char
的指针”。您尝试传入的类型是数组的数组,而不是指针的数组,因此它在此处无法正常工作;数组到指针衰减不起作用,除了在类型的顶层。fun2
有char *arr[]
作为第一个参数。这被解读为“arr
是一个指向char
的指针长度不确定的数组”。这里,第一部分是“arr
是一个数组”,因此数组到指针的衰减起作用,这相当于fun1
(并且它也不起作用)。fun3
有char arr[][]
作为第一个参数。这被解读为“arr
是一个不确定长度为char
s的不确定长度数组的数组”。你不能在数组中存储不确定长度的数组(因为你无法知道它们在编译时的大小),所以它无法正确编译。fun4
将char arr[][10]
作为第一个参数。这被解读为“arr
是一个由10个char
s组成的不确定长度数组的数组”。对于数组到指针的衰减,这相当于char (*arr)[10]
,“arr
是指向10个char
s”数组的指针。这与其他数据不同,因为它期望数组包含固定大小的数组而不是指针。这与您传入的内容相匹配,只是您使用int
在main
中声明它,而int
不等同于char
。您没有列出的示例包括char *arr[5]
,char arr[5][]
或char arr[5][10]
。这些被读作“arr
是一个五个数组...”,并且从数组到指针的衰减分别等同于情况2,3和4;特别是,编译器不验证它确实是一个五元素长的阵列。