介绍
数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。例:int (*p)[10]; p即为指向数组的指针,又称数组指针。-百度百科
问题
在CSDN搜索“数组指针和指针数组”,点击人数最高的一篇文章中是这么写的
(*p)[n]:根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n,这是“数组的指针”,即数组指针;
一个一维数组与一个指针的关系在大部分情况下是等同的,都指向数组第0个元素的首地址,我们可以这样定义一个指针
int a[5] = {1,2,3,4,5}
int *p = a;
这样写编辑器不会报错,也能通过指针来读取数组中的元素。
但是对于数组指针,则不能这样写
int a[5] = { 1, 2, 3, 4, 5 };
int (*p)[5] = a;
报错如下,可见数组指针并不是一个指向一维数组的普通指针
E0144 “int " 类型的值不能用于初始化 "int ()[5]” 类型的实体
修改
对代码进行如下修改
#include <stdio.h>
int main()
{
int a[2][5] = { { 1, 2, 3, 4, 5 },{ 6, 7, 8, 9, 10} };
int(*p)[5] = a;
printf("%d\n", **p);
printf("%d\n", p[0][0]);
printf("%d\n", a[0][0]);
printf("%d\n", **(p+1));
printf("%d\n", p[1][0]);
printf("%d\n", a[1][0]);
}
输出:
1
1
1
6
6
6
可见,数组指针p对应的是一个二维数组,因此p应该是二维数组指针。
p+1则向右移动了1行,也就是移动了5,**(p+1)对应的是a[1][0]
因此,p指向的是数组的的行数,p 指向的数据类型是 int [4],也就是说,p+1 会使得指针指向二维数组的下一行,p-1 会使得指针指向数组的上一行。
*(p+1)单独使用时表示的是第 1 行数据,有些编译器会转换为第一行数据的首地址,有些不会,因此可能指向一个无意义的数。
如果想访问二维数组的每个数据该如何操作呢?
使用*(*(p+x)+y)即可,x为行数,y为列数。亦可以使用p[x][y],效果相同。
题外话:在c语言中,a[n]会被编译器自动转换为*(a+n),n[a]和a[n]是没有区别的,只是一般没有人这样用。
总结
数组指针实质上是二维数组指针,如果说它指向一维数组也没错,但这个一维数组的元素又是多个一维数组。这和二维数组是类似(或者根本就是一样?我不敢打包票)的。
二维数组也能理解为多个一维数组。a [2][3]可以理解为a[2]这个一维数组中有两个元素,这两个元素其实也分别是一维数组,他们是匿名的,步长为3。
免责声明
本人也只是个初学者,如果你用我的观点跟老师/大佬抬杠被打爆了,请不要找我
如有错误,烦请各位大佬指正!