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是否与其他细节有所不同。
最佳答案
假设您将char
放在每个参数的开头,以便它们完全解析,这就是它们的含义:fun1
将char **arr
作为第一个参数。读为“ arr
是指向char
的指针”。您尝试传递的类型是一个数组数组,而不是一个指针数组,因此在这里将无法正常工作。数组到指针的衰减仅在类型的顶级不起作用。fun2
将char *arr[]
作为第一个参数。读取为“ arr
是指向char
的指针的不确定长度的数组”。在这里,第一部分是“ arr
是一个数组”,因此数组到指针的衰减有效,并且等效于fun1
(同样它将不起作用)。fun3
将char arr[][]
作为第一个参数。读取为“ arr
是不确定长度为char
s的数组的不确定长度的数组”。您不能将不确定长度的数组存储在数组中(因为您不知道在编译时的大小),因此此时无法编译。
最后,fun4
将char arr[][10]
作为第一个参数。读为“ arr
是十个char
的数组的不确定长度的数组”。对于数组到指针的衰减,这等效于char (*arr)[10]
,“ arr
是指向十个char
的数组的指针”。这与其他方法不同,因为它期望数组包含固定大小的数组而不是指针。除了使用int
在main
中声明它,并且int
不等同于char
之外,这将与您传递的内容匹配。
您未列出的示例是char *arr[5]
,char arr[5][]
或char arr[5][10]
。这些被读为“ arr
是一个由五个...组成的数组,并且从数组到指针的衰减分别等于情况2、3和4;特别是,编译器不对其进行验证。确实是一个五元素长的数组。
关于c - 传递二维数组之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49971421/