我们通常所说的数组名其实是数组首元素的地址,所以在传参的时候通常传过去的是数组首元素的地址。
void test(int arr[9])
{
//因为传过来的参数是数组首元素的地址
printf("%d\n", sizeof(arr));
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
//将arr传过去
test(arr);
//sizeof关键字求得是arr整个数组的大小
printf("%d\n", sizeof(arr));
return 0;
}
所以结果会大不一样
当然,我们也可以用指针去接收它。
void test(int *arr)
{
//因为传过来的参数是数组首元素的地址
printf("%d\n", sizeof(arr));
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
//将arr传过去
test(arr);
//sizeof关键字求得是arr整个数组的大小
printf("%d\n", sizeof(arr));
return 0;
}
这是一维数组和指针之间的关系。那么二维数组呢?
二维数组是用[][]来定义的,分几行几列
其中数组名是数组首元素的地址,
而arr[0]代表第一行的数组名,数组名有代表数组首元素的地址,所以
arr[0]就代表了第0行第一个元素的地址了。
那么这样看来,arr是地址,arr[0]是地址
所以要找到这个数组里面的内容是不是要用个数组指针呢?
说到数组指针,它就是一个指针,指向一个数组其中有多少个元素。
形式是这样的
int (*arr)[10] 加括号是想让arr先与*号结合成为指针,后面的[]表示指针指向的是一个数组,数组有10个元素。
void test(int(*arr)[3])
{
int a = 0;
int b = 0;
(*arr + 1)[0] = 3;
*((*arr + 1) + 0) = 3;
b = (*arr + 1)[0];
a = *((*arr + 1) + 0);
printf("%d\n", a);
printf("%d\n", b);
}
int main()
{
int arr[3][3] = { 0 };
test(arr);
return 0;
}
其中(*arr + 1)[0] = 3;
*((*arr + 1) + 0) = 3;
这两个其实是等价的,也就是说可以用*号(解引用操作)来代替[][]。
结果如下: