C函数指针语法
我的问题非常简单。
通常,在声明某个变量时,将其类型放在它之前,如:
int a;
函数指针的类型可能是:int(*)(int,int),以防我们指向一个带两个int的函数并返回一个int。 但是,在声明这样的指针时,其标识符不在类型之后,如:
int(*)(int,int) mypointer;
相反,你必须在中间写入标识符:
int(*mypointer)(int,int);
为什么会这样? 对不起,我知道这是一个非常简单的问题……
感谢大家的回复。 如
我在回答中解释了这一点为什么数组,指针和函数的C语法是这样设计的? ,它基本上归结为:
语言作者倾向于使语法以变量为中心而不是以类型为中心。 也就是说,他们希望程序员查看声明并思考“如果我写表达式
*func(arg)
,那将导致一个int
;如果我写*arg[N]
我会有一个浮点数”比“func
必须是指向函数的指针并将其返回”。维基百科上的C条目声称:
Ritchie的想法是在类似于其使用的上下文中声明标识符:“声明反映使用”。
……引用K&R2的p122。
此结构反映了如何声明(和使用)正常函数。
考虑一个正常的函数定义:
int foo (int bar, int baz, int quux);
现在考虑定义一个指向同一签名函数的函数指针:
int (*foo) (int, int, int);
注意这两个结构是如何相互映射的? 这使得*foo
更容易识别为函数指针而不是其他东西。
如果你正在处理一个函数(不是指向一个函数的指针),那么名字也在中间。 它类似于: 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];
我曾在某些地方看到函数指针被声明为
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:我在这个答案中没有遵循命名约定的正确编码指南。