`*(*(p + 1)+1)[7]`等于`p [1] [8] [0]`?

时间:2015-10-29 21:43:50

标签: c pointers

char *p[2][3];

*(*(p+1)+1)[7]如何等于p[1][8][0]

我认为*(*(p+1)+1)[7]*(*(*(p+1)+1)+7)相同,并且等于p[1][1][7],我错在哪里?

E:我不明白为什么这会被贬低......

3 个答案:

答案 0 :(得分:6)

基本事实:

  1. [] associates从左到右
  2. []的高度precedence高于取消引用运算符*
  3. a[i]*(a+i)
  4. 所以

      *(*(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]相同。因此,您可以根据以下步骤转换起始表达式,从而在两个方向上重复使用该标识:

  1. *(p + n)
  2. == *(*(p+1)+1)[7](添加的括号明确表示运算符优先级。)
  3. == *((*(p+1)+1)[7])
  4. == *((p[1]+1)[7])
  5. == *(*((p[1]+1)+7))
  6. == *(*(p[1]+1+7))
  7. == *(*(p[1]+8))
  8. == *(p[1][8])
  9. == *(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]