C函数指针语法

时间:2013-01-01 22:17:03

标签: c declare

我的问题很简单。

通常,在声明某个变量时,将其类型放在它之前,如:

int a;

函数指针的类型可能是:int(*)(int,int),以防我们指向一个带两个int的函数并返回一个int。但是,当声明这样的指针时,它的标识符不在类型之后,如:

int(*)(int,int) mypointer;

相反,您必须在中间写入标识符:

int(*mypointer)(int,int);

为什么会这样? 对不起,我知道这是一个非常简单的问题......

感谢大家的回复。 A.S。

4 个答案:

答案 0 :(得分:19)

我在对Why was the C syntax for arrays, pointers, and functions designed this way?的回答中解释了这一点,它基本上归结为:

  

语言作者倾向于使语法以变量为中心而不是以类型为中心。也就是说,他们希望程序员查看声明并思考“如果我写表达式*func(arg),那将导致int;如果我写*arg[N]我会有浮点数“而不是”func必须是指向并返回 “的函数的指针。

     

C entry on Wikipedia声称:

     

Ritchie的想法是在类似于其使用的上下文中声明标识符:“声明反映使用”。

     

......引用K& R2的第121页。

答案 1 :(得分:14)

此结构反映了如何声明(和使用)正常函数。

考虑正常的函数定义:

int foo (int bar, int baz, int quux);

现在考虑定义一个指向同一签名函数的函数指针:

int (*foo) (int, int, int);

注意两个结构如何相互映射?这使*foo更容易识别为函数指针而不是其他东西。

答案 2 :(得分:7)

如果你正在处理一个函数(不是指向一个函数的指针),那么名字也在中间。它就像:return-type function-name "(" argument-list ")" ...。例如,在int foo(int)中,int是返回类型,foo是名称,int是参数列表。

指向函数的指针的工作方式几乎相同 - 返回类型,然后是名称,然后是参数列表。在这种情况下,我们必须添加*以使其成为指针,并且(因为指针的*是前缀)一对括号将*绑定到名称而不是返回类型。例如,int *foo(int)表示名为foo的函数,它接受一个int参数并返回一个指向int的指针。要将*绑定到foo,我们需要括号,给出int (*foo)(int)

当你需要一个指向函数的指针数组时,这会变得特别难看。在这种情况下,大多数人发现最简单的方法是使用typedef作为指针类型,然后创建一个这种类型的数组:

typedef int (*fptr)(int);

fptr array[10];

答案 3 :(得分:3)

我曾在某些地方看到函数指针被声明为

int(* foo)(int a,int b);

并且在某些地方没有提到a和b,两者仍然有效。

所以int(* foo)(int,int)也是正确的。

我发现要记住的非常简单的方法如下所述

假设函数声明为:int function(int a,int b); Step1 - 简单地将函数放在paranthases中:int(function)(int a,int b); 步骤2-在函数名前放置*并更改名称:                                              int(* funcPntr)(int a,int b);

PS:我在这个答案中没有遵循命名约定等的正确编码指南。