おおざっぱに言えば、 Cでは、配列を定義/宣言することは出来ても その内容を「配列として」アクセスする手段は提供されておらず、 常にポインタを使用してアクセスすることになっています。 p[i]という書き方は出来ますが、これはあくまで *(p + i)の syntax sugarに過ぎません。
Cに、ポインタ演算という妙な機能があるのは、 初期のコンパイラを作成する際に「手を抜いて」最適化の機能を 組み込まなかったためだと思われます。 念のために補足しますと、ここでの「手を抜いて」は誉め言葉です。 C言語が開発された目的(UNIXというOSを記述したかった)を考えれば、 これはその時点では合理的な選択だったのでしょう。
確かに、最適化を全く行なわないコンパイラなら、 ポインタ演算を使ってポインタ自体を進め、*pのように参照すれば、 p[i]と書いて毎回 p + iの加算を行なうよりも高速なコードを 出力することが期待できます。
POINTER