char *p[2][3];
*(*(p+1)+1)[7]
如何等于p[1][8][0]
?
我认为*(*(p+1)+1)[7]
与*(*(*(p+1)+1)+7)
相同,并且等于p[1][1][7]
,我错在哪里?
答案 0 :(得分:6)
基本事实:
[]
associates从左到右[]
的高度precedence高于取消引用运算符*
a[i]
是*(a+i)
所以
*(*(p+1)+1)[7]
= *((*(p+1)+1)[7]) // rule 2
= *(*(*(p+1)+1+7)) // rule 3
= *(*(*(p+1)+8))
= *(*(*(p+1)+8)+0)
= p[1][8][0] // rules 1 and 3
答案 1 :(得分:2)
这取决于[]
与一元*
的相对优先级(前者更高),以及p
是否(或评估)指针和{的基本身份{1}}是整数类型,n
表示与p[n]
相同。因此,您可以根据以下步骤转换起始表达式,从而在两个方向上重复使用该标识:
*(p + n)
*(*(p+1)+1)[7]
(添加的括号明确表示运算符优先级。)*((*(p+1)+1)[7])
*((p[1]+1)[7])
*(*((p[1]+1)+7))
*(*(p[1]+1+7))
*(*(p[1]+8))
*(p[1][8])
*(p[1][8] + 0)
答案 2 :(得分:1)
*(*(p+1)+1)[7]
= *(p[1] + 1)[7]
由于运算符优先级([]
高于*
),该表达式
= *((p[1] + 1)[7])
= *(*((p[1] + 1 + 7))
= *(*(p[1] + 8 ))
= *(p[1][8])
= p[1][8][0]