1. 数组指针:指向数组的指针是数组指针
先看下面一段代码:
#include <stdio.h> int main(void) { int m[10]; printf("m = %p, &m = %p ", m, &m); printf("m + 1 = %p, &m + 1 = %p ", m + 1, &m + 1); return 0; }
运行上面的代码得到的结果如下图:
上面代码中&m是指向数组的指针,也就我们说的数组指针,它在m在数值上是完全相等的,都指向的是同一段内存的起始地址经网友garbageMan指正,改为 “分别指向的是具有同一起始地址的两段(块)内存”。但是它们的类型确是不同的。其中m是 int *型的指针;而&m指向的是int m[10]这样一个数组,是一个数组指针,因此m + 1 相当于加上 sizeof(int),由上图可以计算(0x0028FEFC - 0x0028FEF8) = 4; 而&m + 1相当于加上sizeof(int[10]),由上图中的计算(0x0028FF20 - 0x0028FEF8) = 40。
可以有如下定义:
int (*p)[10] = &m; 这里p就是一个数组指针,并且这里(*p)的括号是必须的,()的优先级高于[],因此p首先是一个指针,然后指向的是int [10]的数组。
2. 指针数组:由多个指针组成的数组是指针数组
int *p[10]; 这里可以和上面数组指针做对比。p首先是一个数组,然后类型是指针,因此p是指针数组(含有10个指针,例如p[0]、p[1]。。。p[9],每个指针的类型为int *),它的每个变量都可以用来存放地址。