语法规则中的什么使返回指针和函数指针的函数原型不同?

时间:2017-02-12 14:14:58

标签: c pointers syntax

用于定义返回指针的函数的原型如下所示:

int * function_name();

同时,函数指针的原型如下所示:

int (*function_name)();

哪些语法规则使这两个定义不同?优先权如何发挥作用?

例如,是

(int *) function_name();

返回指针或指针函数的函数的原型? (我的直觉是它定义了一个返回(int *)的函数,因此它是前者。)

编辑:我意识到我的问题实际上是关于C声明。理解这些资源的良好资源是http://unixwiz.net/techtips/reading-cdecl.html

3 个答案:

答案 0 :(得分:2)

  

哪些语法规则使这两个定义不同?

解析规则是:

  1. 找到标识符。
  2. 始终支持[]()优先于*
  3. 因此,对于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的函数的指针。