|
板凳
楼主 |
发表于 2008-11-16 22:46:25
|
只看该作者
再分析一个复杂的例子
#include <stdio.h>
#define MAX 100
void *call(char *(*)()); //先从外面分析到里面,函数外围为 void *call() 可见,call 是个返回 void * 型的函数。call 括号里面的 char *(*)() 都是 call 的参数。还是从外面分析到里面,先看外面的形式为 char *()
//这是一个返回 char * 指针类型的函数;再看 (*) ,这表明是一个指针,结合起来就是 一个指向 返回类型为 char 指针的函数的 指针。
char *(*RtnFunc())(); //也是从外面分析到里面,外面形式为 char *() ,这是一个返回类型为 char * 的函数;再分析里面 ( *RtnFunc() ) ;*RtnFunc() 可见 RtnFunc 是一个函数,它返回一个指针;那这个指针
//是什么类型呢?从这个指针的结合形式来看,它就是一个指向 char *() 类型函数的指针,也就是说它是一个函数指针。
int main( void )
{
printf("%s",call(RtnFunc())); //由函数的声明可知,call 需要一个 指向返回值为 char * 型的函数指针。而 RtnFun() 函数的返回值正好满足了 call 的参数要求
return 0;
}
char *hello()
{
return "Hello World!\\n";
}
char *(*RtnFunc())() //声明一个函数, 如果这个函数有返回值, 那么就要说明这个函数的返回值的类型;所以,RtnFunc 是一个函数,它的返回值是一个指针类型,接着还要说明这个指针是指向什么的指针,简单的
//就是 char,int 之类的类型,形式比较简单,如 char *RtnFunc() 这样即可;而当这个指针是一个指向一个函数时,那么声明的形式就变得有点复杂,形式就如函数声明中所示。
{
return hello; //hello 是个函数,其实是在 renturn 中调用了 hello ,而 hello 返回一个 char * 指针给 return 再带回去
}
void *call(char *(*func)()) //这里,func 是一个函数指针
{
return (*func)();
} |
|