若有定义;int w[3][5];,则以下不能正确表示该数组元素的表达式是( )。

admin2013-02-23  38

问题 若有定义;int w[3][5];,则以下不能正确表示该数组元素的表达式是(  )。

选项 A、*(*w+3)
B、*(w+1)[4]
C、*(*(w+1))
D、*(&w[0][0]+1)

答案2

解析 通过—维数组名或指向维数组元素的指针来引用数组元素有两种写法:a和*(a+i),它们是等价的。这是一种运算符之间的等价转换,就好像a-(b-C) 等价于a-b+c一样。知道了这种转换,我们可以将之扩展到二维数组甚至任意维数组上来。因为[]运算符的结合性是从左至右的,所以w[j]等价于(w[j],此时可以先将任意一个[]运算符转换为指针形式为:(*(w+i)[j]或*(w+j),或者同时转换:*(*(w+i)+j)。上述几种形式都完全等价于w[j]。选项A中,*(*w+3)可以看成*(*(w+0)+3),即w[0][3],是正确的。选项B小,因为[]运算符的优先级高于*运算符,所以*(w+1)[4]等价于*((w+1)[4]等价于 *(*((w+1)+4)),即*(*(w+5)+0),它等价于w[5][0],很明显它超过数组的范围了,故不正确。选项C等价于w[1][0],是下确的。选项D中,&w[0][0]是数组w第1个元素的地址,它等价于&*(*(w+0)+0),外面的&和*可以抵消,就好像先乘以个数,然后再除以这个数一样。所以,&w[0][0]等价于*(w+0)+0。即*w。所以原式就变为*(*w+1)等价于w[0][1],这个也是合法的。综上所述,本题应该选择B。
转载请注明原文地址:https://kaotiyun.com/show/1HJp777K
0

最新回复(0)