用于定义返回指针的函数的原型如下所示:
int * function_name();
同时,函数指针的原型如下所示:
int (*function_name)();
哪些语法规则使这两个定义不同?优先权如何发挥作用?
例如,是
(int *) function_name();
返回指针或指针函数的函数的原型? (我的直觉是它定义了一个返回(int *)
的函数,因此它是前者。)
编辑:我意识到我的问题实际上是关于C声明。理解这些资源的良好资源是http://unixwiz.net/techtips/reading-cdecl.html
答案 0 :(得分:2)
哪些语法规则使这两个定义不同?
解析规则是:
[]
和()
优先于*
。 因此,对于int * function_name();
,标识符function_name
将与()
而不是*
一起使用,因此function_name
被声明为返回指针int
的函数1}}。
对于int (*function_name)();
,function_name
而非*
附加额外外括号力()
。因此,这将function_name
声明为指向返回int
的函数的指针。
(int *) function_name();
无法在函数外部使用。编译器将报告语法错误。看到(int *)
编译器将解释为转换运算符,function_name()
作为函数调用。
进一步阅读:Deciphering complex declaration like void ( *( *f[] ) () ) ()
。
答案 1 :(得分:1)
(int *) function_name();
作为函数原型是语法错误
以这种方式致电function_name();
时,强制转换返回值为int *
:
int main(void) {
(int *) function_name(); //the return value is being casted to an `int *`
return 0;
}
以下是一个返回指针的函数:
int *function_name();
以下是函数指针,即指向函数的指针:
int (*function_name)();
让我引用this:
当有更多明星投入时,有时人们会感到困惑:
void *(*foo)(int *);
在这里,关键是要从里到外阅读;注意表达式的最内层元素是* foo,否则它看起来像一个普通的函数声明。 * foo应该引用一个返回void *并接受int *的函数。因此,foo是指向这样一个函数的指针。
答案 2 :(得分:0)
好的,所以应用阅读C声明的规则(例如here):
int * function_name();
将function_name声明为返回指向int
的指针的函数,而
int (* function_name)();
将function_name声明为指向返回int
的函数的指针。