後置演算子 を、添字演算子と呼ぶ。は、ポインタと整数をオペランドとして取る。
以下のふたつの式は、全く同等である。
p[i] *(p+i)
ポインタへの 1 加算は、「そのポインタが指すオブジェクトのサイズだけ アドレスを進める」ことを意味する。
int a[10]; のように宣言した配列を a[i] のようにして アクセスする場合、a は式の中なので、ポインタに読み換えられている。 そのため(ポインタと整数をオペランドとして取る)添字演算子で アクセスできるのであり、文法上は、演算子[]は配列とは全く無関係である。 p[i] は、*(p+i) の簡略記法(構文糖 --- syntax sugar)に過ぎない。
POINTERより

なるほど。

int *p;
p = (int*) malloc(size);
p[0] = 2;
p[1] = 3;
printf("%d",p[1]);
として、2が出力されるのは、p[1] == (*p + 1) だったからなんですね。