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语法,但不能在函数体之外使用。