查看: 3627|回复: 6
打印 上一主题 下一主题

纠结的指针

[复制链接]
跳转到指定楼层
沙发
发表于 2014-8-5 15:07:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.    如所示程序,输出什么?
程序清单:
  1. int  iArray[3] = { 1 , 11 , 22} ;
  2. int  *ptr     = iArray ;
  3. printf( "*ptr++ = %d \n" , *ptr++ ) ;
  4. printf( "*ptr   = %d \n" , *ptr   ) ;
复制代码
纠结啊,是先算*ptr还是ptr++;还是纠结啊,ptr是地址加1还是偏移一个数组元素!
这里考查了两个知识点,其一:*++的优先级问题;其二,数组i++++i的问题。*++都是优先级为2,且都是单目运算符,自右向左结合。所以这里的*ptr++*(ptr++)是等效的。
首先ptr是数组首元素的地址,所以ptr++是偏移一个数组元素的地址。那么ptr++运算完成之后,此时的ptr是指向iArray[1],所以第二个输出*ptr = 11 那么倒回来看第一个输出,ptr++是在执行完成*ptr++之后再执行的,所以,*ptr++ = 1

2、程序清单所示程序,输出会是什么?
  1. int  iArray[3] = { 1 , 11 , 22} ;
  2. int  *ptr       = iArray ;
  3. printf( "*++ptr = %d \n" , *++ptr ) ;
  4. printf( "*ptr   = %d \n" , *ptr   ) ;
复制代码
这个解释和上面解释差不多,就是++ptrptr++的差别,所以这里的两个输出都是:11。同样的道理,*++ptr*(++ptr)是等效。

3、程序清单
  1. int  iArray[3] = { 1 , 11 , 22} ;
  2. int  *ptr       = iArray ;
  3. printf( "(*ptr)++ = %d \n" , (*ptr)++ ) ;
  4. printf( "*ptr   = %d \n" , *ptr   ) ;
复制代码
这个的输出是:1,2。原因请读者分析

回复

使用道具 举报

板凳
发表于 2014-8-5 15:41:09 | 只看该作者
...好复杂 的样子{:soso_e134:}
回复 支持 反对

使用道具 举报

地板
 楼主| 发表于 2014-8-5 15:42:49 | 只看该作者
本帖最后由 伊海 于 2014-8-5 15:44 编辑
lxe 发表于 2014-8-5 15:41
...好复杂 的样子
int k = 8 ;
int i = 10 ;
int j = 10 ;
k *= i+++j ;
printf("%d \n" , k) ;??
面试题就是如此的变态
回复 支持 反对

使用道具 举报

4#
发表于 2014-8-5 15:44:44 | 只看该作者
伊海 发表于 2014-8-5 15:42
int k = 8 ;int i = 10 ;int j = 10 ;k *= i+++j ;printf("%d \n" , k) ;??面试题就是如此的变态

。。。。这个。。怎么破?
回复 支持 反对

使用道具 举报

5#
 楼主| 发表于 2014-8-5 15:53:12 | 只看该作者
lxe 发表于 2014-8-5 15:44
。。。。这个。。怎么破?

这里k *= i+++j ,加上括号之后就是这样:k = k * ((i++) + j) ;答案是160;



回复 支持 反对

使用道具 举报

6#
发表于 2014-8-6 09:31:53 | 只看该作者
K好好看,好好学啊
回复 支持 反对

使用道具 举报

7#
发表于 2014-8-6 10:28:08 | 只看该作者
指针好复杂,一直没搞弄呢,,前天做了程序。
unsigned  char   Tab[]={..................}
unsigned    char  *p;
p=Tab;//此语句是把Tab的首地址给指针。。也可以这么写,,p=&Tab[0];;前面的那句竟然没看懂,修为尚浅,还需努力
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表