{
printf("%d",x);
}
void k(void(* vt)(int e))
{
vt(7);
}
main()
{
k(get);
getch();
}
这是一个“函数指针作为函数形参”的问题
void get(int x){ printf("%d",x); }
void k(void(* vt)(int e)){ vt(7); }
main() { k(get); getch(); }
首先我们先把它想象成一个美女,让我们来一件件的把她的衣服剥开~肉麻 *_*
(1)首先看void k(void(* vt)(int e)){...} 这个函数定义你怎么看都不爽。的确,这样的形态我们比较少见。但是我见过更加变态的(*void(*)()0)();这样的东西足以让任何一个C程序员胆寒。
好了,少说废话。 函数k的参数是void(* vt)(int e) 这个是什么东西呢?其实这个就是: “定义了一个函数指针vt,这个函数指针所指向的函数必须要有一个整形行参~!”
好,现在我们能理解void k(void(* vt)(int e))到底是什么东西了 他的意思就是: “定义一个函数k,k的参数是一个指向有一个‘整形行参’的函数的指针vt” 没理解?继续理解,然后你才能继续往下看。
(2)然后到vt(7);这个就很好理解啦。他就是调用vt所指向的那个函数。
(3)最后,我们来理解一下k(get);我们在前面已经说过了vt是“一个指向有一个整形行参的函数的指针”。那么vt到底要指向那个函数呢?对,它指向了get函数。为什么?因为k(get);,而且get函数满足vt指针所要求的条件:有一个整形行参的函数。
所以,到最后我们可以这样片面的理解这个程序: k(get);调用了函数k; 函数k定义了函数指针vt作为k的形参,然后再令这个指针vt指向函数get(); 并且vt(100);调用了函数get(),并且把100作为get()的参数传递给了get();
[此贴子已经被作者于2005-2-23 22:04:06编辑过]