在C语言编程中,将数组作为函数参数传递涉及一些细微差别,尤其是在处理一维和二维数组时。本博客旨在通过研究不同的数组传递方式来澄清这些概念。
void arr_a(int arr[]) {}
在这种情况下,数组通过引用传递,且未指定大小信息。函数可以操作任何大小的数组。
void arr_a(int arr[5]) {}
这种方式指定了数组的大小。然而,必须注意只能省略第一个维度的大小。
void arr_a(int *arr) {}
数组退化为指针,因此该函数接受指向数组第一个元素的指针。再次强调,未提供大小信息。
void arr_a(int **arr) {}
该函数接受指向指针的指针,暗示二维数组。然而,这可能不适用于一维数组。
void arr_a(int* arr[3]) {}
这里期望一个指针数组。数组的每个元素都是一个指针,数组大小为3。
int main() {
int arr[3] = { 0 };
int *arr2[3] = { 0 };
arr_a(arr);
arr_a(arr2);
return 0;
}
void arr_a(int arr[3][5]) {}
在这种情况下,函数期望一个具有固定大小的二维数组。第一个维度的大小可以省略,但第二个维度的大小是必需的。
void arr_a(int arr[][5]) {}
类似于前一个示例,第一维度的大小可以省略,但第二维度的大小是必需的。
void arr_a(int (*arr)[5]) {}
这种方式允许省略第一维度的大小,使其更加灵活。该函数接受指向具有第二维度固定大小的数组的指针。
int main() {
int arr[3][5] = {0};
arr_a(arr);
return 0;
}
二维数组传参,函数形参的设计只能省略第一个[]的数字。因为对一个二维数组,可以不知道有多少行,但是必须知道一行多少元素,这样才方便运算。