一、题目一
#include <stdio.h>
int main()
{
char *a[] = {"work","at","alibaba"};
char**pa = a;
pa++;
printf("%s\n", *pa);//输出结果时at
return 0;
}
pa指向数组a首元素的地址,如下图所示,pa++指向的是数组的下一个位置,对其解引用之后得到a[1]的值也就是at
二、题目二
#include <stdio.h>
int main()
{
char *c[] = {"ENTER","NEW","POINT","FIRST"};
char**cp[] = {c+3,c+2,c+1,c};
char***cpp = cp;
printf("%s\n", **++cpp);//POINT
printf("%s\n", *--*++cpp+3);//ER
printf("%s\n", *cpp[-2]+3);//cpp[2]==*(cpp-2)//ST
printf("%s\n", cpp[-1][-1]+1);//cpp[-1][-1]=*(*(cpp-1)-1)+2,EW
return 0;
}
下面我们可以通过画图来理解
第一个输出是POINT,因为cpp加1,指针向前移一个单位,指向了c+2再通过解引用得到对应的值
第二个输出是ER,我们先看第一个解引用符号*++cpp是指向c+1的位置的,但是它再通过二次解引用*--之后,那么原本指向c+1的位置就指向了c的值,然后得到了ENTER,但是它得到了ENTER的值后数组向右移了3个单位,那么得到的最终结果是ER。
第三个输出是ST,cpp原来指向的是c+1的位置,但是在*cpp[-2]下往前移了两个单位,指向了c+3,那么对应的值就是FIRST,在这个数组中再+3那么就得到了ST。
第四个输出的是EW,cpp[-1]使得它指向了c+2的位置,但是再-1之后就变成了c+1,随之就是指向了c+1的位置,那么得到的值就是NEW,数组NEW+1得到的值就是EW。
三、总结
通过这一次练习,我们更能清楚运用指针来解决问题,就是多画图,多练,我们才能更加熟悉指针,还要牢记基础的概念等,到了这里,关于指针的内容就告一段落了,感谢大家的支持