今の例では何が便利なのか良くわかりませんね。 #define で十分じゃないかと思った方、まったくです。 (#define integer int でも同じ事ができる。)
でも次の例を見てください。
typedef char* cpTyp1 ;
#define cpTyp2 char*
cpTyp1 cp1, cp2 ;
cpTyp2 cp3, cp4 ;
両方とも、
[型] [変数名1], [変数名2] ;
という形をしていますね。 こういう形の場合、 [変数名1] と [変数名2] は同じ型を持つはずですが...
cpTyp1 を使って宣言されたインスタンス、 cp1, cp2 は供に char* 型となります。 つまり、typedef は cpTyp1 という [型] を作り出しました。
ところが、cpTyp2 を使って宣言されたcp3, cp4は、 マクロが展開されて、
char* cp3, cp4 ;
つまり、
char *cp3, cp4 ;
となるので、cp3 は char* 型、cp4 は char 型 になります。 つまり、#define では [型] を作り出せないのです。