关于二维数组和函数的问题

这个代码是正确的,我只想问,明明main函数里面arr二维数组的行数是3;
为什么到了第二个函数,他的全局变量的二维数组行数却是4,并且还可以运行呢?

#include 

void findmax(int (*pArr)[4], int *pmax, int m, int n);

int main(void)
{ 
  int arr[3][4], *pa, max[3], i;
  pa = arr[0];
  for (i=0; i<12; i++)
  {
     scanf("%d", pa++);
  }
  
findmax(arr,max,3,4)

  for (i=0; i<3; i++)
  {
     printf("line %d's max = %d\n", i, max[i]);
  }
  return 0;
}

void findmax(int (*pArr)[4], int *pmax, int m, int n)
{
   int i, j;

   for (i=0;  ifor (j=1; jif 
( *(pArr[i]+j)>*pmax)

         {
             
*pmax=*(pArr[i]+j);

         }
    }
   }
} 
 
void findmax(int (*pArr)[4], int *pmax, int m, int n)
这里的4是列数4,不是行数4啊,兄弟

  • 代码中,main 函数中定义的 arr 数组有 3 行 4 列,但是当你在调用 findmax 函数时,你传入的参数是 arr 数组的指针,并且用了类型转换来将它转化为 int (*pArr)[4] 类型的指针,这意味着 pArr 指针会指向一个具有 4 列的数组。所以在 findmax 函数中,pArr 的行数是 4,而不是 3。
  • 这种类型转换的方式叫做"数组名不会丢失维度的类型转换",在 C 语言中是允许的。这种方式可以在函数调用时将二维数组的行数作为参数传入函数,而不会丢失行数信息。
  • 所以,在 findmax 函数中,pArr 的行数是 4,而且代码也可以正常运行,因为它仍然可以对数组中的每一行进行操作。
  • 不过,在 findmax 函数中,你需要注意的是,当你使用 pArr 作为循环变量时,你需要使用的是 m 而不是 4,因为 m 才是真正传入的数组的行数。