1. 一维数组参数传递的形参定义一维数组作为参数时有三种等价的写法编译器都会将其处理为指针// 写法1数组形式最直观表明意图是接收数组 void func(int arr[], int size) { ... } // 写法2指针形式本质数组退化为指向首元素的指针 void func(int *arr, int size) { ... } // 写法3指定大小仅作提示编译器会忽略大小 void func(int arr[10], int size) { ... }关键点数组传递时不会拷贝整个数组只传递首元素地址。函数内部无法通过数组本身获取其长度因此必须额外传递一个size参数。三种写法在功能上完全等价推荐使用int arr[]或int *arr2. 二维数组参数传递的形参定义二维数组传递时必须指定第二维的大小因为编译器需要知道每行有多少个元素来计算地址偏移。// 写法1指定第二维大小最常用必须指定列数 void func(int arr[][5], int rows) { ... } // 写法2指针数组指向数组的指针 void func(int (*arr)[5], int rows) { ... } // 写法3如果列数是动态的C99及以后支持变长数组VLA void func(int rows, int cols, int arr[rows][cols]) { ... }关键点二维数组同样退化为指针类型是 “指向一维数组的指针”如int (*)[5]。必须指定列数否则编译器无法计算arr[i][j]的地址。如果需要处理任意列数的二维数组可以使用指向指针的指针int **arr但需要手动管理内存。