回复:(mebol)[讨论] 数组
| -- 作者:mebol -- [讨论] 数组 若有以下定义和语句: static int w[2][3],(*pw)[3]; pw=w; 则对w数组元素的非法引用是: A:*(pw[0]+2) B: *(pw+1)[2] C: pw[0][0] D: *(pw[1]+2) 请大家写详细点为什么是?为什么不是?谢谢 分析: w是二维数组,pw是行指针。 A:pw[0]相当于w[0]->*(a[0]+2)我们知道a[0]代表w第一行的首地址,所以a[0]+2,就是w第一行第三个元素的地址,再*(a[0]+2),就是引用元素[0][2]. B: *(pw+1)[2]->*(pw[0]+1)[2]这里*(pw[0]+1)按上面分析就已经是引用w[0][1]了,所以再加个[2]就多余了。 C:pw[0][0]->a[0][0]这应该没问题吧 D:*(pw[1]+2)分析同A相当于第二行第三个元素,即w[1][2]. |
----------------解决方案--------------------------------------------------------
答案是B
*(pw+1)[2]这个有错误,由于[]的优先级高于*,所以该式子等价于*(*(pw+1+2)),即*(*(pw+3))=pw[3][0],数组越界了
其他的正确
*(pw[0]+2)等价于pw[0][2]
*(pw[1]+2)等价于pw[1][2]
----------------解决方案--------------------------------------------------------
( *(pw+1) ) [2]
这样改的话``B对吗``
----------------解决方案--------------------------------------------------------
回复:(死了都要C)( *(pw+1) ) [2]这样改的话``B对吗...
这样就对了,*(pw+1)代表第二行的行指针,(*(pw+1))[2]就表示引用该行第三列的数值[此贴子已经被作者于2007-11-8 15:03:17编辑过]
----------------解决方案--------------------------------------------------------
以下是引用nianshi在2007-11-8 14:46:27的发言:
| -- 作者:mebol -- [讨论] 数组 若有以下定义和语句: static int w[2][3],(*pw)[3]; pw=w; 则对w数组元素的非法引用是: A:*(pw[0]+2) B: *(pw+1)[2] C: pw[0][0] D: *(pw[1]+2) 请大家写详细点为什么是?为什么不是?谢谢 分析: w是二维数组,pw是行指针。 A:pw[0]相当于w[0]->*(a[0]+2)我们知道a[0]代表w第一行的首地址,所以a[0]+2,就是w第一行第三个元素的地址,再*(a[0]+2),就是引用元素[0][2]. B: *(pw+1)[2]->*(pw[0]+1)[2]这里*(pw[0]+1)按上面分析就已经是引用w[0][1]了,所以再加个[2]就多余了。 C:pw[0][0]->a[0][0]这应该没问题吧 D:*(pw[1]+2)分析同A相当于第二行第三个元素,即w[1][2]. |
pw + 1 = &(w[0][0]) + 3 * sizeof(int)
或可以这样分析
*(pw + 1)[2];
pw = pw + 1 ; /* pw[1] */
*pw[2]; /* [] 运算符的优先级 比 * 高 */
----------------解决方案--------------------------------------------------------