首先对指针分级要有一个比较清晰的认知:
- 变量本身一定会有一个内存地址,不管他是基本类型变量或是指针型变量
- 指针型变量所保存的值是他指向的内存的地址
定义的时候 int* 代表指向一块int变量内存地址的指针int** 代表指向一块int变量指针的内存的指针
这么说可能不太好理解,看下面这个图可以帮助理解
可以看到变量app指向的实际上是指针ap,而不是a,我们改变ap的指向也不会影响到app的指向。
这个图也可以很好的解决为什么打印&a是一个地址,而打印&ap是另一个地址,因为&ap指向的并不是a的地址。
然后要区分一下*号所处的语义上下文
比如,int * a ,这个情况下,号所处上下文是变量定义的上下文,这个时候号的作用实际上是这么来看的int* a,可以把int和*看成一个整体,语义就是这是一个指向int型变量的指针。
另一种情况下*a,这个情况下a必然是个指针,因为 * 号的语义是去a地址(所以a才必须是指针)取出对应的值。
理解了以上两点,基本就理解了多级指针了
比如 * * * * p,是在做什么呢,按照之前逻辑来分析,大概就是
通过*层层取出地址对应的值,最后指向结果PVVVV,PVVVV是类型的值取决于它自己存放的类型,不出错的情况下PVVVV就是PVVV的指针的指向类型