曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4668|回复: 3
打印 上一主题 下一主题

C/C++语言中指向函数的指针

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2008-11-16 22:46:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C/C++语言中指向函数的指针
                        Quote:
[blockquote]“在C语言中,函数本身不是变量,但可以定义指向函数的指针,这种指针可以被赋值、存放于数组之中,传递给函数及作为函数的返回值等” --《The C Programming Language Second Edition》 [/blockquote]

--------------------代码开始-----------------------------


#include

#define TESTDATE 100



int func(int a)  /* func用于打印一个整数 */

{

return printf("%d\n",a);

}

main()

{

int (*FunctionPionter)(int a);

FunctionPionter = func;

(*FunctionPionter)(TESTDATE);

return 0;

}


--------------------代码结束-----------------------------

FunctionPionter 用括号括起来是必须的,因为若不括起来,则 FunctionPionter 与(int a) 结合,成为了函数名(* 的优先级比 () 低)。所以 (*FunctionPionter) 声明 FunctionPionter 是一个指针,并指向一个函数(函数的指针),这个函数含有一个整形参数,且这个函数的返回值为 int 。

在FunctionPionter = func; 语句后,FunctionPionter  就指向了 func ,于是可以用FunctionPionter  来使用函数 func 的功能了---> (*FunctionPionter)(TESTDATE);

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
沙发
 楼主| 发表于 2008-11-16 22:46:47 | 只看该作者

对于2# 的分析采取一种折中却不失明朗的做法

                        Quote:
[blockquote]
#include

#define MAX 100



typedef char *(*PtoFun)();       
//这里使用 typedef 的做法,说明了 PtoFun 是一个指向函数的指针类型,这个函数没有参数且返回值是 char *


main()

{

void *call(PtoFun);

PtoFun RtnFunc();



printf("%s",call(RtnFunc()));

return 0;

}



char *hello()

{

return "Hello World!\\n";

}



PtoFun RtnFunc()

{

return hello;

}



void *call(PtoFun func)

{

return (*func)();

}
[/blockquote]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
板凳
 楼主| 发表于 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)();

}

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
地板
 楼主| 发表于 2009-4-22 19:56:15 | 只看该作者
在 linuxsir 上有位兄弟提出要实现:
( f() )();
其中,f()实现一次函数调用,然后f()返回一个函数指针,接着利用这个函数指针再进行一次函数调用。其意就是“一个表达式实现两次函数调用“

其实这仍然是个函数的指针问题

测试代码
#include "stdio.h"

void * a(void);
void * b(void);
void * c(void);

typedef void *(*FunPoint)();

int main()
{
FunPoint f = a;

((FunPoint)(f()))();

return 0;
}

void * a(void)
{
printf("This is the 'a' function.\\n");
return b;
}

void * b(void)
{
printf("This is the 'b' function.\\n");
return c;
}

void * c(void)
{
printf("This is the 'c' function.\\n");
return a;
}
说明
在各个子函数中,返回的是函数名。其实函数名有两个用途,一个就是用自身( 函数本身调用 ),一个就是传递给相应的函数指针来使用,这两者本质上是一样的。所以这里,要直接使用返回的函数名,那么只需要把返回值强制转换成函数指针类型即可。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-13 05:01 , Processed in 0.065070 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表