C函数指针语法(C function pointer syntax)

2019-07-17 18:22发布

我的问题是非常简单的。

通常情况下,一些声明变量时,你把它的类型之前,如:

int a;

一个函数指针可以具有像类型:整数(*)(INT,INT),在我们的情况下指向该需要两个int并返回一个int的函数。 但是,声明这样的指针的情况下,它的标识符不是所述类型之后,如:

int(*)(int,int) mypointer;

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

int(*mypointer)(int,int);

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

感谢大家的回答。 如

Answer 1:

我在答复中解释这为什么是数组,指针C语法和功能设计的这种方式? ,它基本上可以归结为:

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

在维基百科上ç进入声称:

里奇的想法是在类似环境使用它们来声明标识符:“声明反映使用”。

... K&R2的理由是P122。



Answer 2:

这种结构反映了正常功能的声明方式(和使用)。

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

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

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

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

请注意这两个结构是如何互为镜像? 这使得*foo更容易识别为一个函数指针,而不是别的东西。



Answer 3:

如果你正在处理一个功能(而不是指向一个),这个名字是在中间了。 它是这样: 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];


Answer 4:

我在一些地方函数指针声明见过

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:我没有遵循正确的编码规则对这个答案的命名约定等。



文章来源: C function pointer syntax
标签: c declare