BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #10009同步于 2008/7/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[求助]关于函数指针调用问题

abobo
2008/7/24镜像同步1 回复
有以下一段关于函数指针问题的小程序: #include<iostream> using namespace std; void print_stuff(float data); void (*ptr_func)(float data); int main() { float b=100; ptr_func=print_stuff; (*ptr_func)(b);//问题在这里 ptr_func(b); return 0; } void print_stuff(float data) { cout<<"the number is :"<<data<<endl; } (*ptr_func)(b)和ptr_func(b)都能够实现函数功能,函数指针到底用哪一种调用方式?为什么这两个都能够实现调用函数? PS:环境是在VC 6.0下
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
Xer机器人#1 · 2008/7/24
看看这个:http://bbs.chinaunix.net/viewthread.php?tid=702660 这是因为在 C/C++ 中总是使用函数指针的形式来调用函数。即使在函数调用中使用的是函数指示符(代表函数类型),也会被转换为函数指针使用,这就是默认的 function-to-pointer 转换。 例如,楼主程序中的 test 函数可以直接使用函数指示符形式来调用:test( 9 );。然而,在这里的函数指示符 test 其实被编译器自动转换为了函数指针来使用,既从函数类型转换为了函数指针类型,最终是使用函数指针的形式来完成对函数调用的。 程序中的 fp( 9 ); 是直接使用函数指针 fp 来调用。既然 fp 已经是函数指针了,所以在类型上就不需要任何转换了。 (*fp)( 9 ); 也是合法的函数调用。在这里,fp 是函数指针,所以 *fp 是对于函数的引用,是函数类型。根据标准规定的 function-to-pointer 转换又把 *fp 由函数类型转换为了函数指针类型,所以实际上 (*fp)( 9 ); 相当于 fp( 9 ); 这种直接的函数指针调用方式。 另外,test 函数也可这样调用:(*test)( 9 );。可以这样来理解:根据 function-to-pointer 转换规定首先 test 由函数类型转换为函数指针,那么 *test 表示的又是函数类型,最后又根据 function-to-pointer 转换为函数指针来调用函数。这其实和 (*fp)( 9 ); 是等价的。 甚至 test 函数还可以这样调用:(**test)( 9 );、(***test)( 9 );、(****test)( 9 ); 等等,或者函数指针形式:(**fp)( 9 );、(***fp)( 9 );、(****fp)( 9 ); 等等。对此的理解可参看上段中的分析。 从上面的分析可以看出,函数调用的时候可以使用函数指针的方式,也可以使用函数指示符的方式。不过,后者会由编译器自动转换为前者的形式,即函数指针的形式。和指向对象的指针相比,这是函数指针一个比较特殊的地方。 【 在 abobo (abobo) 的大作中提到: 】 : 有以下一段关于函数指针问题的小程序: : #include<iostream> : using namespace std; : ...................