#include <stdio.h> void Function() { printf("Call Function!\n"); } int main() { void (*p)(); p=Function; (*p) (); //(p) (); //上面两者都能输出Call Function!,那两者有什么不同之处呢??? return 0; }
呵呵,扩展讨论一下这个问题,比如: int a; a “指代”的是个整数实体。 struct _B { int b1; int b2; } b; b “指代”的是个结构实体,注意是这个含两个域的struct型实体的全部噢,既不单单是其中的b1,也不单单是其中的b2,是全部噢。 void f() { .... } f “指代”是这个函数的所有指令的整体。在普通表达式中,f表示函数中第一条指令的地址值,而在进行小括号操作时,即f(),f是作为“函数整体”的意思的,表示要执行这个函数中一系列指令。 void (*p)(); p “指代”的又是什么呢?只是个函数指针而已。p = f;一句中,f表示函数第一条指令的地址值,赋值给了p。如果我们在设计C编译器时非常“严苛”,那么p就不能直接进行小括号操作,因为它根本不“指代”整个函数嘛。我们必须先对p进行"*"操作,也就是人们常说的dereference操作,得到指代“函数整体”的事物,然后才能进行小括号操作。即(*P)()。如果我们故意把一个int a变量的地址赋值给p,p = (void (*)())&a; 语法上也可以,当然一运行(*P)()就挂了。所以正统的写法是(*P)();不过所幸的是ANSI标准没有这里所说的那么“严苛”了,于是支持p()的简写方式。 所以《C陷阱与缺陷》中才会说: “(*fp)(); 因为fp是一个函数指针,那么*fp就是该指针所指向的函数,所以(*fp)()就是调用该函数的方式。ANSI C标准允许程序员将上式简写为fp(),但是一定要记住这种写法只是一种简写形式。”
69,372
社区成员
243,080
社区内容
加载中
试试用AI创作助手写篇文章吧