こんにちは。お世話になります。

int (*fp)(int);

と記述すると
intを1つ引数にもち、intを返す関数のポインタ変数fpを
宣言することになりますが、

typedef int (*fp)(int);

と記述すると、
intを1つ引数にもち、intを返す関数のポインタ型名「fp」
を作成することになります。

このtypedefの使用例は構文例外なのでしょうか。
決り文句だと考えていればいいとは思うのですが。

また解説書などでは、

typedef int int_array3[3];

などの記述についても説明されているものをあまり見かけません。
K&Rではtypedefは記憶クラス指定子扱いであるとは
書いてありますが、ここらへんを詳しく説明している
文献などありましたら教えていただけないでしょうか。