永发信息网

请问函数指针和指针函数的运用?

答案:2  悬赏:60  手机版
解决时间 2021-07-30 23:11
请问函数指针和指针函数的运用?
最佳答案

函数指针是一种指向函数的指针,本质上是一种指针;如:


int (*p)(int a);


int get(int a)


{


return a;


}


p=get;


p(1);



指针函数是返回值为指针的函数,本质上是一种函数;如:


int* get(int* a)


{


return a;


}


全部回答

以前学C语言的时候也看过。不过由于用的不多,所以概念也比较模糊,直到这一阵一下子碰到了好几次有关于函数指针的程序。所以花了一些时间仔细研究了一下。

1,定义函数指针: return_type (*func_pointer)(parameter_list) 例如:int (*p)(); 定义一个函数指针p,参数列表为空。 void add() { ... } void main() { void (*p)()=add; (*p)(); //执行函数,等效于add(); }

2,定义返回函数指针的函数: return_type(*function(func_parameter_list))(parameter_list) 定义了一个函数function,该函数的参数列表是(function_patameter_list),返回类型是一个函数指针,这个函数指针的原型是return_type(*)(parameter_list)。

例: int (*add1(int a,int b))(int,int) 此处:此函数的函数主体为add1,add2函数作为add1的形参,返回值为一个函数指针。 注:返回的函数的形式必须为int funcname(int,int)

可以用typedef来简化定义: //此函数等效于上面函数 typedef int (*funcp)(int)(int); //定义整型函数指针 funcp add1(int a,int b);

碰到的一些实例:

1、上电后把存放在Nand flash中的程序复制到内存中以0x30900000开始的地方,之后跳转到相应地址执行程序。 这是阿南的2410开发板的简易bootloader程序。由于Nand flash不能直接运行程序,所以要把程序复制到内存中运行。如下: #define DOWNLOAD_ADDRESS 0x30900000 void main() { //把程序复制到内存中 ... //跳转到想应地址运行程序 *((void(*)())(DOWNLOAD_ADDRESS))(); }

分解:DOWNLOAD_ADDRESS为复制的目标地址。 void(*)() 为函数指针,参数为空。 (void(*)())DOWNLOAD_ADDRESS 把DOWNLOAD_ADDRESS转为函数指针。 *((void(*)())(DOWNLOAD_ADDRESS))(); 执行相应函数

2、实现类似于windows中的回调函数,实现两个数的加法。 int add1(int x,int y) { return x+y; } int add(int a,int b, int (* func)(int x,int y)) { return (* func)(a,b); }

调用: add(3,4,add1);

3、一个综合的例子:

#include <stdio.h> typedef int (*funcp)(int,int);

//普通三个变量的加法函数 int func(int x,int y,int z) { // return x+y; printf("func:x+y+z=%d\n",x+y+z); return x+y+z; }

void (*dec(int x,int y))(int a,int b,int c) { printf("dec:x-y=%d\n",x-y); return (void *)func; }

int add(int x,int y) { return x+y; }

int (*add1(int a,int b,int (*add2)(int x,int y)))(int,int) { printf("add1:a+b+a+b=%d\n",a+b+(*add2)(a,b)); return add2; }

funcp add3(int a,int b, funcp add4) { printf("add3:a+b+a+b=%d\n",a+b+add4(a,b)); return add4; }

//函数a1-a5用来验证函数指针数组的功能。 void a1() { printf("this is a1!\n"); } void a2() { printf("this is a2!\n"); } void a3() { printf("this is a3!\n"); } void a4() { printf("this is a4!\n"); } void a5() { printf("this is a5!\n"); }

int main() { int addr; //定义函数指针 int (*p)(int,int,int); char i; //定义函数指针数据,初始化存放a1-a5的函数地址。 void (*funcarry[5])()={a1,a2,a3,a4,a5}; int a[5]={(int)a1,(int)a2,(int)a3,(int)a4,(int)a5};

//直接把函数地址转化为整型 addr=(int)func;

//把函数地址赋给一个函数指针p p=func;

//把印出func的地址。 printf("func address is %d\n",addr);

//利用一个整型的地址来实现3+4+5 printf("This is addr %d\n",(*((int(*)(int,int,int))addr))(3,4,5));

//利用函数指针来实现3+4+5 printf("This is func pointer %d\n",(*p)(3,4,5));

//利用dec函数实现5-4,并且打印出返回的函数指针的地址。 printf("func address is %d %d\n",dec(5,4),addr);

//以下两个功能一致,实现3+4+3+4 printf("add for add1 address is %d %d\n",add1(3,4,add),(int *)add); printf("add for add3 address is %d %d\n",add3(3,4,add),(int *)add);

//利用函数指针数组实现函数a1-a5的执行。以下两种方法等效。 for(i=0;i<5;i++) (*funcarry[i])();

for(i=0;i<5;i++) (*((void(*)())a[i]))(); }

运行环境:Red hat 9.0

运行结果:

func address is 134513448 func:x+y+z=12 This is addr 12 func:x+y+z=12 This is func pointer 12 dec:x-y=1 func address is 134513448 134513448 add1:a+b+a+b=14 add for add1 address is 134513529 134513529 add3:a+b+a+b=14 add for add3 address is 134513529 134513529 this is a1! this is a2! this is a3! this is a4! this is a5! this is a1! this is a2! this is a3! this is a4! this is a5!

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
项城市周口国祥商务宾馆(东方大道店)地址在哪
关于制作幻灯片
为什么冬天戴帽子身体会暖和些?
我国的国民收入总值是多少?
QQ宠物魔法俱乐部的东西会过期吗 我要是不把
虽然空气因为流动,内部各个方向都有压强,但空
浙江四区诺斯玛尔戾龙轻甲护肩多少钱
怀孕两个多月了这两天吃辣的东西脸上长好多豆
源汇区漯河市源汇区易事多便利店(六十七号店)
宽带下载的数度慢
CPU散热的问题
初二下学期数学题!
电脑刚开机发送的字节比接受的字节多
生物怎么样才学得好
女生只适合戴那种三角形的围巾吗??急!
推荐资讯
湛河区平顶山川味馄饨饺子馆这个地址在什么地
外网用日语怎么说,建筑外网和外线分别是什么
我是真的很爱我老婆,可是她的脾气太不好了,我
钣金工资多少钱一个月,厨师工资是多少一个月
26日更新的活动,现在都没有开放吗?
玛雅文化到底说了什么?2012到底会怎样?
看字后面加个向上的箭头是什么意思?
手机抢车位要怎么进
为什么登录上游戏大厅却玩不起来
问道杀星坐标和地点在哪?
打开QQ校友网无法显示问题
dnf5分钟掉一次线怎么办?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?