C函数指针语法

use*_*583 35 c declare

我的问题非常简单.

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

int a;
Run Code Online (Sandbox Code Playgroud)

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

int(*)(int,int) mypointer;
Run Code Online (Sandbox Code Playgroud)

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

int(*mypointer)(int,int);
Run Code Online (Sandbox Code Playgroud)

为什么会这样?对不起,我知道这是一个令人费解的简单问题......

感谢大家的回复.如

det*_*tly 20

我在答案中解释了这一点为什么数组,指针和函数的C语法是这样设计的?,它基本上归结为:

语言作者倾向于使语法以变量为中心而不是以类型为中心.也就是说,他们希望程序员看的声明,并认为"如果我写的表情*func(arg),那将导致int;如果我写*arg[N]我有一个浮动",而不是" func必须是一个指向函数服用并返回那个 ".

维基百科上C条目声称:

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

......引用K&R2的p122.


ato*_*inf 15

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

考虑一个正常的函数定义:

int foo (int bar, int baz, int quux);
Run Code Online (Sandbox Code Playgroud)

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

int (*foo) (int, int, int);
Run Code Online (Sandbox Code Playgroud)

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


Jer*_*fin 9

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

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

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

typedef int (*fptr)(int);

fptr array[10];
Run Code Online (Sandbox Code Playgroud)


小智 9

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

int (*foo) (int a, int b);
Run Code Online (Sandbox Code Playgroud)

并且在某些地方ab没有被提及,但两者仍然有效。

所以

int (*foo) (int, int)
Run Code Online (Sandbox Code Playgroud)

也是对的。

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

假设函数声明为:

int function (int a , int b);
Run Code Online (Sandbox Code Playgroud)

步骤1:只需将函数放在括号中:

int (function) (int a , int b);
Run Code Online (Sandbox Code Playgroud)

Step2:*在函数名前加一个,改名:

int (*funcPntr) (int a , int b);
Run Code Online (Sandbox Code Playgroud)

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