怎么理解数组指针?
我们可以借助其他类型的指针来理解,如,
- 整型指针,就是指向整型类型的指针。
- 字符指针,就是指向字符类型的指针。
- 所以数组指针,其实就是指向数组的指针。
那这2个指针有什么区别?
int arr[3] = {1, 2, 3};
int* p1 = arr;//整型指针变量
int (*p2) [3] = &arr;//数组指针变量
区别在于:
- int* p1指向的其实是arr数组的首元素地址,也就是arr[0]。如果打印*(p1 + 1)的地址,打印的是arr[1]的地址。
- 而 int (p2) [3]指向的是整个数组。如果打印(p2 + 1)的地址,打印的是arr[2]+ 4 的地址。(arr[2]是arr数组的最后一个元素地址,这个地址还有元素,+4则是arr数组后面的第1个地址)
如图:
数组指针一般在哪里使用?
其实使用场景并不多,因为很多时候使用其他指针可以更容易理解。
但数组指针在多维数组传参的时候,非常合适。
因为我们知道,数组传参的时候,传的是数组首元素的地址,而多维数组首元素又是一个数组,这个时候,我们就可以使用数组指针来进行做形参。
代码实现:
#include <stdio.h>
void Print(int(*p)[3], int r, int c)
{
int i = 0;
int j = 0;
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
//另外,下面这条语句也可以写为:printf("%d ", p[i][j])
//
// 因为*p+i == p[i]
// 所以*((*p + i) + j) == *(p[i] + j)
// 然后我们把p[i]又视为*p+i中的p
// 则 *(p[i] + j) 等价于 p[i][j]
//
// 结论:*((*p + i) + j) == p[j][i]
//
printf("%d ", *((*p + i) + j));
}
printf("\n");
}
}
int main()
{
int arr[3][4] = { 1,2,3,4,2,2,3,4,3,2,3,4 };
Print(arr, 3, 4);
return 0;
}