2015-10-29 4 views
3

char *p[2][3];Как `* (* (p + 1) +1) [7]` equal `p [1] [8] [0]`?

Как *(*(p+1)+1)[7] равно p[1][8][0]?

Я думал, что *(*(p+1)+1)[7] будет таким же, как *(*(*(p+1)+1)+7), и это равно p[1][1][7], где я не прав?

E: Я не понимаю, почему это время downvoted ...

+0

Как вы определяете р? – Elipzer

+3

Postfix '[]' имеет более высокий приоритет, чем унарный '*'. – EOF

+0

Забыл добавить, что @Elipzer. Это 'char * p [2] [3]'. Благодарю. – YoTengoUnLCD

ответ

6

Основные факты:

  1. []associates Слева направо
  2. [] имеет более высокую precedence, чем оператор разыменования *
  3. 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
*(*(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

Это зависит от относительного приоритета [] против одноместной * (бывший выше), и тот факт, что если p (или оценивает) указатель и n имеет целочисленный тип, тогда p[n] означает то же, что и *(p + n). Таким образом, вы можете превратить ваше отправное выражение в соответствии со следующими шагами, делая повторное использование, в обоих направлениях, эта идентичность:

  1. *(*(p+1)+1)[7]
  2. == *((*(p+1)+1)[7]) (Добавленные скобки выражают приоритет оператора в явном виде.)
  3. == *((p[1]+1)[7])
  4. == *(*((p[1]+1)+7))
  5. == *(*(p[1]+1+7))
  6. == *(*(p[1]+8))
  7. == *(p[1][8])
  8. == *(p[1][8] + 0)
  9. == p[1][8][0]