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);