因仑“3+1”工程特种兵精英论坛

标题: 纠结的指针 [打印本页]

作者: 伊海    时间: 2014-8-5 15:07
标题: 纠结的指针
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。原因请读者分析


作者: lxe    时间: 2014-8-5 15:41
...好复杂 的样子{:soso_e134:}
作者: 伊海    时间: 2014-8-5 15:42
本帖最后由 伊海 于 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) ;??
面试题就是如此的变态
作者: lxe    时间: 2014-8-5 15:44
伊海 发表于 2014-8-5 15:42
int k = 8 ;int i = 10 ;int j = 10 ;k *= i+++j ;printf("%d \n" , k) ;??面试题就是如此的变态

。。。。这个。。怎么破?
作者: 伊海    时间: 2014-8-5 15:53
lxe 发表于 2014-8-5 15:44
。。。。这个。。怎么破?

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




作者: lucky80204    时间: 2014-8-6 09:31
K好好看,好好学啊
作者: 张衍波    时间: 2014-8-6 10:28
指针好复杂,一直没搞弄呢,,前天做了程序。
unsigned  char   Tab[]={..................}
unsigned    char  *p;
p=Tab;//此语句是把Tab的首地址给指针。。也可以这么写,,p=&Tab[0];;前面的那句竟然没看懂,修为尚浅,还需努力




欢迎光临 因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) Powered by Discuz! X3.4