C函数指针语法

C函数指针语法,c,declare,C,Declare,我的问题很简单 通常,在声明某个变量时,将其类型放在前面,如: int a; 函数指针的类型可能类似于:int(*)(int,int),以防我们指向一个接受两个整数并返回一个整数的函数。但是,在声明此类指针时,其标识符不在类型之后,如: int(*)(int,int) mypointer; 相反,您必须在中间写入标识符: int(*mypointer)(int,int); 为什么会这样? 对不起,我知道这是一个令人尴尬的简单问题 谢谢大家的回复。 A.S.此结构反映了正常函数的声明(和使用

我的问题很简单

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

int a;
函数指针的类型可能类似于:
int(*)(int,int)
,以防我们指向一个接受两个整数并返回一个整数的函数。但是,在声明此类指针时,其标识符不在类型之后,如:

int(*)(int,int) mypointer;
相反,您必须在中间写入标识符:

int(*mypointer)(int,int);
为什么会这样? 对不起,我知道这是一个令人尴尬的简单问题

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

此结构反映了正常函数的声明(和使用)方式

考虑一个普通函数定义:

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

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

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

注意这两个结构是如何相互镜像的?这使得
*foo
更容易识别为函数指针,而不是其他对象。

我在对的回答中对此进行了解释,基本上可以归结为:

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

索赔要求:

里奇的想法是在类似其用法的上下文中声明标识符:“声明反映了用法”

…引用K&R2第122页


如果你在处理函数(不是指向一个函数),名字也在中间。它类似于:

返回类型函数名“(“参数列表”)”..
。例如,在
intfoo(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 function (int a , int b);
步骤1:只需将函数放在括号中:

int (function) (int a , int b);
步骤2:在函数名前面放置一个
*
,然后更改名称:

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

PS:在这个回答中,我没有遵循命名约定等适当的编码准则。

这不是唯一的情况,你也在数组声明中使用这种样式。搜索“声明反映使用”。这个Q有助于解释Typedef语法
Typedef旧类型别名标识符
但示例函数指针示例,如“Typedef int”(*sum_func)(int,int);“语法不匹配…直到现在!函数原型中的参数名在C中是可选的,所以
int(*foo)(inta,intb);
int(*foo)(int,int);
都有效。
int (*funcPntr) (int a , int b);