变态的指针!

来源:互联网 发布:咖啡袋排气阀 知乎 编辑:程序博客网 时间:2024/04/28 00:52

求下面程序的输出结果:

#include<stdio.h>char *c[]={"ENTER","NEW","POINT","FIRST"};char **cp[]={c+3,c+2,c+1,c};char ***cpp=cp;void main(){printf("%s\n",**++cpp);printf("%s\n",*--*++cpp+3);printf("%s\n",*cpp[-2]+3);printf("%s\n",cpp[-1][-1]+1);}              

运行程序,结果为:

POINTERSTEW

这里,主要涉及到多维指针的操作。

先来几个概念和公式:

(1)指针数组(参见:http://www.cnblogs.com/hongcha717/archive/2010/10/24/1859780.html)
定义 int *p[n];
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。

(2)*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j],这四个表达式是等价的,也就是说p[i]=*(p+i),这个公式很重要!


下面开始解题(理解可能有误,参考即可!):


如图所示,左边和中间的粗箭头代表下标增加的方向,(最右边的字符串增加方向应该都是向右,图中没有表示出来,只标出起始位置)

(1)**++cpp:首先cpp自增,在最左边的箭头上向箭头方向滑动1个单位,指向cp[1],然后取值两次,跳到最右边,结果为POINT

(2)*--*++cpp+3:首先cpp自增,指向cp[2],然后取值一次,跳到中间c+1,再自减,滑动到c,取值一次,跳到最右边,最后加3,移动3个字符单位,所以结果为ER

(3)*cpp[-2]+3:首先根据公式p[i]=*(p+i)cpp[-2]之后,cpp的指向没有变化,还是cp[2],运算结果跳到中间的c+3,然后取值一次,跳到最右边,最后加3,移动3个字符单位,所以结果为ST

(4)cpp[-1][-1]+1:cpp[-1][-1],运算中,结果指针先向下滑动指向cp[1],然后取值一次,跳到c+2,再向上滑动到c+1,然后取值一次,跳到最右边,最后加1,移动1个字符单位,所以结果为EW

0 0