对于普通指针,看下面代码
int a[5] = {3,2,6,7,5};
int *pp = a; //指针pp指向数组a
printf("%p\n",pp); // 输出的是数组a的地址,也是数组a第一个元素的地址
printf("%d\n", *pp); // 加上解引用*,得到的是数组a第一个元素的值
printf("%d\n", pp[0]); // 数组a第一个元素的值
printf("%d\n", *pp[0]); //编译错误
运行结果(去掉最后一行代码)
0x7fffcbad7730
3
3
好了,再看一下数组指针
int a[5] = {3,2,6,7,5};
int (*p)[5] ; // 声明一个数组指针P
p = &a; // 这里就体现和上面的不同了,上面是直接 pp = a ,但是这里要写 p = &a
printf("%p\n", p); //输出的是a的地址
printf("%p\n",*p); //猜猜这里输出的是什么,依然是a的地址 (*p)表示数组a本身,所以输出的是a的地址
printf("%p\n",p[0]); //输出的依然是a的第一个元素的地址
printf("%d\n", *p[0]); //这样才会输出a的第一个元素的值
printf("%d\n", *p[1]); //输出的不是a中第二个元素的值,而是一个很大的无效的值
运行结果:
0x7fffa20fbdc0
0x7fffa20fbdc0
0x7fffa20fbdc0
3
32767
好了总结下,数组指针和普通指针相比,感觉是多取了一次地址的样子,数组指针很多时候用于指向二维数组中。