我试图弄清楚函数声明的含义:
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。
诸如函数调用之类的后缀运算符的()优先级高于诸如 之类的一元运算符*,因此
T *f();
读作
f -- f
f() -- is a function (() binds before *)
*f() -- returning a pointer
T *f(); -- to T (for some type T)
如果你想强制*绑定 before (),你必须明确地用括号分组,所以
T (*g)();
读作
g -- g
(*g) -- is a pointer
(*g)() -- to a function
T (*g)(); -- returning T.
数组的规则类似:T *a[N]是指向的指针的数组T,而T (*p)[N]是指向 的数组的指针T。