说明:接下来的例子,都会用画图的方法来解释
例1:
int main()
{
const char* a[] = { "work", "at", "alibaba" };
const char** pa = a;
pa++;
printf("%s\n", *pa);
//打印的结果是" at ";
//理由是,数组a是一个指针数组,二级指针指向数组a,那么pa直接指向的就是数组中的第一个指针
//所以pa++指向的就是第二个指针,解引用得到的就是那个指针指向的数据:“at”
return 0;
}
例题中,pa属于二级指针,其指向的内容可以是一级指针、也可以是指针数组。
例二:(这个例子比较复杂,需要有耐心)
在这里提前说明一下,c是一个指针数组,cp是一个二级指针数组,而cpp是一个三阶指针
int main()
{
const char* c[] = { "ENTER", "NEW", "POINT", "FIRST" };
const char** cp[] = { c + 3, c + 2, c + 1, c };
const char*** cpp = cp;
printf("%s\n",**++cpp); //POINT
printf("%s\n",*-- * ++cpp + 3); //ER
printf("%s\n",*cpp[-2] + 3); //ST
printf("%s\n",cpp[-1][-1] + 1); //EW
return 0;
}
解释如下列图像:
在第一个printf下,首先会对三级指针cpp进行++,而后会对其进行解引用。
注意:在cpp进行++后,cpp所指向的位置会发生改变!即下图所说明的
第二个printf下,保留了第一次cpp++造成的影响,如下解释:
这里的cpp-2,cpp的位置并不会因此而改变;就像你int a = 10, 然后printf("%d\n", a - 2);
在你进行调试的时候,a的值依然不会发生变化,只是借用了a的数值进行的运算而已;
同理如下
至此,所有的内容已经解释完毕了。
好好学习,就能变强!