関数宣言の意味を理解しようとしています:
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
。