例えばポインタ演算子 **p は右から順に結合する。つまり、(* (*p) ) という事だ。
これと同じように考えればいい。

つまり char * const p; は (* (const p)) であり、p そのものを変更する事はできない。
p が指す先を変更する事はできる。

一方 char const * p; は (const (*p)) であり、p そのものは変更する事ができる。
p が指す先を変更する事はできない。

そして char const * const p; は (const (* (const p) ) ) であり、p も p が指す
ものも変更できない。

なお const char * p; は char const * p; と全く同一である。


654-655 の説明は、かえってわかりにくいと思う。
「ポインタ演算子と同じく右から順に結合する」 と覚えればよい。