prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 4.12

Q我看到过通过指针调用函数的不同语法。这是怎么回事?


A最初,函数指针必须先通过*操作符“转换”为“真实”函数才能调用。

	int r, (*fp)(), func();
	fp = func;
	r = (*fp)();
最后一行可以这样理解:fp是一个函数指针,所以*fp就是函数;在其后加上用括号括起来的参数列表(以及额外的括号*fp以确保正确的优先级),你就得到了一个函数调用。

也可以这样认为:函数总是通过指针调用的,而“真实”的函数名(在表达式中,正如在初始化中一样;参见问题1.34)总是会隐式地退化为指针。这种推理意味着:

	r = fp();
是合法的并且可以正确工作,无论fp是函数名还是指向函数的指针。(这种用法一直都很明确;你永远不可能对一个函数指针后面跟一个参数列表做除了调用它所指向的函数之外的任何事情。)

ANSI C 标准基本上采用了后一种解释,这意味着显式的*不是必需的,尽管它仍然是允许的。

另请参见问题1.34

参考文献:K&R1 Sec. 5.12 p. 116
K&R2 Sec. 5.11 p. 120
ISO 第 6.3.2.2 节
Rationale Sec. 3.3.2.2
H&S Sec. 5.8 p. 147, Sec. 7.4.3 p. 190


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管