我试图弄清楚函数声明的含义:
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
。