C 语法规则中的什么使返回指针和函数指针的函数原型不同?
定义返回指针的函数的原型如下所示:C 语法规则中的什么使返回指针和函数指针的函数原型不同?,c,pointers,syntax,C,Pointers,Syntax,定义返回指针的函数的原型如下所示: int * function_name(); int (*function_name)(); 同时,函数指针的原型如下所示: int * function_name(); int (*function_name)(); 什么语法规则使这两个定义不同?优先权是如何发挥作用的 例如,是吗 (int *) function_name(); 返回指针或指针函数的函数的原型?(我的直觉是,它定义了一个返回(int*)的函数,因此是前者。) 编辑:我意识到我的问
int * function_name();
int (*function_name)();
同时,函数指针的原型如下所示:
int * function_name();
int (*function_name)();
什么语法规则使这两个定义不同?优先权是如何发挥作用的
例如,是吗
(int *) function_name();
返回指针或指针函数的函数的原型?(我的直觉是,它定义了一个返回(int*)
的函数,因此是前者。)
编辑:我意识到我的问题实际上是关于C声明的。了解这些的一个好资源是
作为函数,原型是语法错误。调用
函数_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)();
让我举个例子
有时,当更多的星星被投进来时,人们会感到困惑:void*(*foo)(int*)代码>
在这里,关键是要从里到外阅读;请注意,表达式最里面的元素是*foo,否则它看起来像一个普通的函数声明*foo应该引用一个返回void*并接受int*的函数。因此,foo就是指向这样一个函数的指针
什么语法规则使这两个定义不同
解析的规则是:
找到标识符李>
总是偏爱[]
和()
而不是*
李>
因此,对于int*函数_name()代码>,标识符函数名
将与()
一起,而不是*
,因此函数名
被声明为返回指向int
指针的函数
对于int(*函数名称)()
,额外的外圆括号强制函数名
随*
而来,而不是()
。因此,它将function\u name
声明为指向返回int
的函数的指针
(int*)函数_name()代码>不能在函数外部使用。编译器将报告语法错误。当看到(int*)
时,编译器将把is解释为cast运算符,function\u name()
解释为函数调用
进一步阅读:。好的,那么应用阅读C声明的规则(例如):
将函数_name声明为返回指向int
的指针的函数,而
int (* function_name)();
将函数名声明为指向返回int
的函数的指针C的语法显然不完美。请尝试返回函数指针的函数。消除歧义是一件棘手的事情,但必须完成。幸运的是,我们可以使用typedef来缓解这种尴尬。您正在编写c解析器吗?@alpha yes(int*)function_name()
是有效的C语法,但不能在函数体之外使用。