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放在每个参数的开头,以便它们完全解析,这就是它们的含义:


fun1char **arr作为第一个参数。读为“ arr是指向char的指针”。您尝试传递的类型是一个数组数组,而不是一个指针数组,因此在这里将无法正常工作。数组到指针的衰减仅在类型的顶级不起作用。
fun2char *arr[]作为第一个参数。读取为“ arr是指向char的指针的不确定长度的数组”。在这里,第一部分是“ arr是一个数组”,因此数组到指针的衰减有效,并且等效于fun1(同样它将不起作用)。
fun3char arr[][]作为第一个参数。读取为“ arr是不确定长度为char s的数组的不确定长度的数组”。您不能将不确定长度的数组存储在数组中(因为您不知道在编译时的大小),因此此时无法编译。
最后,fun4char arr[][10]作为第一个参数。读为“ arr是十个char的数组的不确定长度的数组”。对于数组到指针的衰减,这等效于char (*arr)[10],“ arr是指向十个char的数组的指针”。这与其他方法不同,因为它期望数组包含固定大小的数组而不是指针。除了使用intmain中声明它,并且int不等同于char之外,这将与您传递的内容匹配。


您未列出的示例是char *arr[5]char arr[5][]char arr[5][10]。这些被读为“ arr是一个由五个...组成的数组,并且从数组到指针的衰减分别等于情况2、3和4;特别是,编译器不对其进行验证。确实是一个五元素长的数组。

关于c - 传递二维数组之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49971421/

10-11 22:05
查看更多