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。原因请读者分析
|