関数宣言の意味を理解しようとしています:
int *f();
と
int (*g)();
int *f();
上記の行は、fパラメーターの数が指定されておらず、を返す関数の宣言ですint *。
int (*g)();
上記の行は、gパラメーターの数が指定されておらず、を返す関数へのポインターの宣言ですint。
cdecl(1)ここでの他の正解への追加として、これらの種類の宣言を解読するための便利なツールであることに言及したいと思います。
$ cdecl
Type `help' or `?' for help
cdecl> explain int *f();
declare f as function returning pointer to int
cdecl> explain int (*g)();
declare g as pointer to function returning int
cdecl既にマシンにインストールされている場合もありますが、 http://cdecl.orgの便利な Web インターフェイスから使用することもできます。
fは関数を返しint*、gは関数を返すポインタintです。
function-call などの後置演算子は、 などの()単項演算子よりも優先順位が高い*ため、
T *f();
として読む
   f     -- f
   f()   -- is a function (() binds before *)
  *f()   -- returning a pointer
T *f();  -- to T (for some type T)
の前に強制的*にバインドする()場合は、括弧で明示的にグループ化する必要があるため、
T (*g)();
として読む
    g     -- g
  (*g)    -- is a pointer
  (*g)()  -- to a function
T (*g)(); -- returning T.  
規則は配列についても同様です。 は へのポインターの配列ですT *a[N]が、 は の配列へのTポインターT (*p)[N]ですT。