传递2d数组之间的区别

时间:2018-04-22 22:41:54

标签: c arrays pointers

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是否与其他细节有所不同。

1 个答案:

答案 0 :(得分:0)

假设您将char放在每个参数的开头,以便他们完全解析,这就是他们的意思:

  • fun1char **arr作为第一个参数。这被读作“arr是指向char的指针”。您尝试传入的类型是数组的数组,而不是指针的数组,因此它在此处无法正常工作;数组到指针衰减不起作用,除了在类型的顶层。
  • fun2char *arr[]作为第一个参数。这被解读为“arr是一个指向char的指针长度不确定的数组”。这里,第一部分是“arr是一个数组”,因此数组到指针的衰减起作用,这相当于fun1(并且它也不起作用)。
  • fun3char arr[][]作为第一个参数。这被解读为“arr是一个不确定长度为char s的不确定长度数组的数组”。你不能在数组中存储不确定长度的数组(因为你无法知道它们在编译时的大小),所以它无法正确编译。
  • 最后,fun4char arr[][10]作为第一个参数。这被解读为“arr是一个由10个char s组成的不确定长度数组的数组”。对于数组到指针的衰减,这相当于char (*arr)[10],“arr是指向10个char s”数组的指针。这与其他数据不同,因为它期望数组包含固定大小的数组而不是指针。这与您传入的内容相匹配,只是您使用intmain中声明它,而int不等同于char

您没有列出的示例包括char *arr[5]char arr[5][]char arr[5][10]。这些被读作“arr是一个五个数组...”,并且从数组到指针的衰减分别等同于情况2,3和4;特别是,编译器不验证它确实是一个五元素长的阵列。