一维数组:
void test(int arr[]) // 可行,arr是一个整型数组,创建一个整型数组接收
{}
void test(int arr[10]) // 可行,与上一种形式没有什么区别,10可以省略
{}
void test(int *arr) // 可行,实参arr,数组名本质上是首元素的地址,而元素是int类型,所以可以用整型指针接收
{}
void test2(int *arr[20]) // 可行,实参brr,是一个存放了20个元素的数组,每个元素类型是整型指针。
{}
void test2(int **arr) // 可行,brr是一个存放指针的数组,而brr(数组名)又是首元素的地址,
//第一次解引用找到brr的首元素(是一个指针),再解引用找到这个指针指向的元素
{}
int main()
{
int arr[10] = {0};
int* brr[20] ={0};
test(arr);
test2(brr);
}
二维数组:
void test(int arr[3][5]) //可行,用一个二维数组接收,行可以省略,但列不能省略
{}
void test(int * arr) // 不可行, 不能用一个整型指针接收
{}
void test(int * arr[5]) // 不可行,这里arr是一个数组,存放了5个元素,每个元素的类型是int*,也就是存放了5个整型指针
{}
void test(int (*arr)[5]) // 可行, arr是一个数组指针,指向一个含有5个元素的数组,每个元素是int类型
{}
void test(int ** arr) // 不可行,arr不是二级指针
{}
int main()
{
int arr[3][5] = { 0 };
test(arr);
}
补充:二维数组的首元素是第一行
int arr[5]; 整型数组,有5个元素
int* p[10]; 指针数组,存放10个整型指针的数组
int(*p)[10]; 数组指针,指向一个数组,这个数组有10个元素,每个元素的类型是int
int(*p[10])[5]; p是一个存放10个指针的数组,每个指针可以指向一个数组,数组5个元素,类型是int
这里,我们可以先看名字(p)是不是和 [ ] 放在一起
比如第二个, 那么它首先是一个数组,数组存放了10个元素,每个元素的类型是int*;
第四个,首先是一个数组,有10个元素,*又代表着每个元素是指针,指针指向的也是数组,含有5个元素,元素的类型是int
而第二个,p并没有和 [ ] 直接结合,那么它首先是一个指针,指向的是含有10个元素的数组