5.指针和数组
数组名代表什么?
众所周知,数组名就是数组首元素的地址(严谨一点,是数组首元素的首地址),那到底是不是呢?看实例:
很显然是的。既然我们已经了解了指针基本的运算,又知道数组名是首元素的地址,那我是不是可以通过数组名来遍历数组呢?请看↓
很显然也是可以的。那就意味着操作数组元素的时候可以通过指针来完成:
有了上面的基础,我们可以推导一下:
很显然有arr[ i ] <==> *(arr + i) <==> *(arr + i)
我们知道“[ ]”本质上是个操作符,arr和i是两个操作数,
那arr[ i ]可不可以写成i[ arr ]呢?我们试一下:
经过验证,我们惊奇地发现竟然也是可以的!
所以,如果用p来表示arr的话,我们甚至可以用p[ 2 ]来调用数组中的元素。
6.二级指针
我们很容易定义一个指针变量:
int a = 10; int* pa = &a;
那pa是一个指针变量,是变量就得有地址啊,那指针变量的地址存放在哪里呢?这就引出了我们要说的 - 二级指针。
我们可以通过这样的形式来定义二级指针:
int a = 10; //(1) int* pa = &a; //(2) int** ppa = &pa;//(3)
(2)中定义的pa为指针变量,(3)中定义的ppa就是一个二级指针,它指向的是pa的地址。在(3)中,第二个“*”说明定义的ppa是一个指针变量,而前面的“int*”意思是ppa这个指针指向的pa是一个int*类型,即整型指针。
我们看一下运行结果:
画一个图来进一步理解二级指针:
理解之后不难发现,ppa也有它自己的地址,所以我们还可以定义三级指针、四级指针...
对pa解引用可以找到a,同理,对ppa解引用就可以找到pa:
*pa <==> a *ppa <==> pa <==>&a
既然这样,如果再对*ppa解引用,就相当于对pa解引用,就可以找到a啦!那事实是不是这样呢?看图!
![]()