怎么理解数组指针?

我们可以借助其他类型的指针来理解,如,

  • 整型指针,就是指向整型类型的指针。
  • 字符指针,就是指向字符类型的指针。
  • 所以数组指针,其实就是指向数组的指针。

那这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;
}
输出结果:

数组指针_数组指针_02