变态的指针!

求下面程序的输出结果:

#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);
}              

运行程序,结果为:

POINT
ER
ST
EW

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

先来几个概念和公式:

(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值