变态的指针!
来源:互联网 发布:咖啡袋排气阀 知乎 编辑:程序博客网 时间: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
- 变态的指针!
- 变态的C++函数指针
- 变态指针.cpp
- 变态的
- 日本的变态产品说明书
- 当代大学生的变态生活
- 变态的微软
- 变态的幸福
- hdu1012 变态的输出
- 变态的blog
- 变态的LR---- LoadRunner
- 儿时的变态卡通片
- 变态的面试题目
- 变态的pkg-config
- 变态的SONY
- 变态的vimperator简介
- 超级变态的问题
- 变态下载的未来
- java ckeditor和ckfinder整合(二)
- 不用辅助变量交换两个整数的值。真的很简单吗?
- java中的comparable和comparator
- CentOs图形界面的开启与关闭
- 商户们的赚钱利器,消费者的剁手助手:支付宝钱包
- 变态的指针!
- 在微信的浏览器中下载手机安装文件 解决方法
- iOS_33_音效
- javax.el.PropertyNotFoundException: The class 'java.lang.String' does not have the property 'XXX'
- ios UINavigation 用法示例
- Oracle sys和system用户、sysdba 和sysoper系统权限、sysdba和dba角色的区别
- EditText获取焦点
- 8_C# 实现VMS客户端——窗体设计_自定义标题窗体
- C++ Built-In Array 的语义