中科因仑“3+1”工程特种兵精英论坛
标题: 纠结的指针 [打印本页]
作者: 伊海 时间: 2014-8-5 15:07
标题: 纠结的指针
1. 如所示程序,输出什么?
程序清单:
- int iArray[3] = { 1 , 11 , 22} ;
- int *ptr = iArray ;
- printf( "*ptr++ = %d \n" , *ptr++ ) ;
- 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、程序清单所示程序,输出会是什么?
- int iArray[3] = { 1 , 11 , 22} ;
- int *ptr = iArray ;
- printf( "*++ptr = %d \n" , *++ptr ) ;
- printf( "*ptr = %d \n" , *ptr ) ;
复制代码这个解释和上面解释差不多,就是++ptr和ptr++的差别,所以这里的两个输出都是:11。同样的道理,*++ptr和*(++ptr)是等效。
3、程序清单
- int iArray[3] = { 1 , 11 , 22} ;
- int *ptr = iArray ;
- printf( "(*ptr)++ = %d \n" , (*ptr)++ ) ;
- 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 编辑
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:53
这里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 |