结论
数组传参本质上传递的是地址。
一维数组传参
先看主函数
int main()
{
int arr1[5] = { 0 };
int* arr2[10] = { 0 };
test1(arr1);
test2(arr2);
return 0;
}
test1() 函数可以这么设计
void test1(int arr[5])
{ }
void test1(int arr[ ])
{ }
void test1(int* arr)
{ }
这三种方式都是可以的。数组传参本质上是地址,数组本质上是指针,所以用指针接收地址是正确的。(形参数组方括号[ ]中的数字可有可无,编译器是不读的)
同理,test2() 函数可以这么设计
void test2(int* arr[10])
{ }
void test2(int** arr)
{ }
二维数组传参
先看主函数
int main()
{
int arr[3][4] = { 0 };
test(arr);
return 0;
}
下面判断 test() 函数设计是否正确
void test(int arr[3][4])
{ }
void test(int arr[ ][4])
{ }
void test(int arr[3][ ])
{ }
void test(int arr[ ][ ])
{ }
这四种方式用数组来接收地址,涉及到二维数组的定义问题,二维数组在定义时,可以不知道有多少行,但必须知道有多少列,所以第二个[ ]内的数字不能省略。因此从二维数组的定义方式来看,第三种和第四种的设计是不对的。
void test(int* arr)
{ }
定义整形指针来接收地址,虽然编译器可以编译,但是我们接收二维数组使用时,很难准确的表示数组中的元素,这一点和一维数组不同,需要注意。
void test(int* arr[5])
{ }
定义的指针数组,不符合要求。
void test(int (*arr)[5])
{ }
这种表示方式是正确的,也是二维数组指针正确的定义。
另外
数组传参时,无论是用数组形式接收,还是用指针形式接收,arr都不再表示整个数组。比如:一维数组arr,在主函数中,&arr表示整个数组的指针,而函数中的&arr则表示指向arr这个指针地址的指针。
void test(int arr1[])
{
printf("arr1=%p\n", arr1);
printf("&arr1=%p\n", &arr1);
}
int main()
{
int arr[5] = { 0 };
printf("arr=%p\n", arr);
printf("&arr=%p\n", &arr);
test(arr);
return 0;
}
打印结果为: