我的问题是非常简单的。
通常情况下,一些声明变量时,你把它的类型之前,如:
int a;
一个函数指针可以具有像类型:整数(*)(INT,INT),在我们的情况下指向该需要两个int并返回一个int的函数。 但是,声明这样的指针的情况下,它的标识符不是所述类型之后,如:
int(*)(int,int) mypointer;
相反,你必须写在中间的标识:
int(*mypointer)(int,int);
为什么会这样? 对不起,我知道这是一个embarassingly简单的问题...
感谢大家的回答。 如
我在答复中解释这为什么是数组,指针C语法和功能设计的这种方式? ,它基本上可以归结为:
语言作者优选使语法变量为中心的,而不是类型为中心。 也就是说,他们希望程序员看的声明,并认为“如果我写的表达*func(arg)
那将导致int
;如果我写*arg[N]
我有一个浮动”,而不是“ func
必须是指向一个功能服用此并返回一个 ”。
在维基百科上ç进入声称:
里奇的想法是在类似环境使用它们来声明标识符:“声明反映使用”。
... 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(*富)(INT A,INT B);
在一些地方和b未提及双方仍然有效。
所以INT(* FOO)(INT,INT)也是正确的。
我发现要记住很简单的方法是如下所述
假设函数被声明为:Int函数(INT A,INT B); 第一步 - 在paranthases简单地把函数:int(函数)(INT A,INT B); Step2-放入的函数名前的a *和改变名称:INT(* funcPntr)(INT A,INT B);
PS:我没有遵循正确的编码规则对这个答案的命名约定等。