您的位置:首页 > 其它

函数指针初始化和调用的几种方法

2017-04-12 21:03 211 查看
文章转自:http://blog.csdn.net/zongyinhu/article/details/48790555

看如下代码,然后思考如下几个问题:

[cpp]
view plain
copy
print?

<span style="font-family:KaiTi_GB2312;font-size:18px;">#include<iostream>  
#include<cstdlib>  
using namespace std;  
  
int func()  
{  
    cout << "my name is zyh_helen" << endl;  
    return 0;  
}  
  
int main()  
{  
    int(*p)() = func;   //函数指针初始化方式1  
    int(*p1)() = &func; //函数指针初始化方式2  
  
    func();//函数调用方式1  
    (*p)();//函数调用方式2  
    p();   //函数调用方式3  
  
    system("pause");  
    return 0;  
}</span>  

问题1:初始化函数指针时,为何既可以在函数名之前加&操作符,又可以不加?
问题2:函数调用方式有几种,他们之间的区别是什么?

问题3:函数指针的用途有哪些?

1:函数指针初始化方式有两种:

方式2中的&操作符是可选的,因为函数名被使用时总是由编译器把它转化为函数指针,&操作符只是显示的说明了编译器将隐式执行的任务

2:函数调用方式有三种:

函数调用方式1:使用函数名调用函数,执行过程可能和你想象的不一样,函数名首先被转化为一个函数指针,该指针指定函数在内存中的位置,然后,函数调用操作符()调用该函数,执行开始于这个地址的代码。
函数调用方式2:首先对p执行间接访问操作,它把函数指针转化为一个函数名,这个转换并不是真正需要的,因为编译器在执行函数调用操作符之前又会把它转换回去。
函数调用方式3:省去了编译器的隐式转化

因此,通过函数指针调用函数时,最好选择方式3

3:函数指针的用途:

1:回调函数:用户把一个函数指针作为参数传递给其他函数,后者将“回调”用户的函数
2:转移表  :本质:一个函数指针数组
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: