p[3]や*(p+3)は オK
だが
int *p,q p[q]は問題無いが、*(p+q)は迷惑。p[q]じゃないと殴りたくなる
というか、後世に継承してもらうのは無理と思って欲しい。

ちなみにC++では
Class *p( operator[](int)が定義澄み)
p[2] はコンパイルエラー
(*p)[2] この書き方じゃないとNG
p->[2]なんて書けない。

void *p
p=(void*)(p+3);はコンパイル可能だし警告もおそらく出ない。
p=&(p[3]);は警告が出る筈。
(処理系によってはコンパイルが通らない場合がある。)
こういった微妙な相違はあるな。