【c和指针学习笔记】函数指针的初始化以及函数调用的三种方式
2015-09-28 21:29
525 查看
看如下代码,然后思考如下几个问题:
问题1:初始化函数指针时,为何既可以在函数名之前加&操作符,又可以不加?
问题2:函数调用方式有几种,他们之间的区别是什么?
问题3:函数指针的用途有哪些?
1:函数指针初始化方式有两种:
方式2中的&操作符是可选的,因为函数名被使用时总是由编译器把它转化为函数指针,&操作符只是显示的说明了编译器将隐式执行的任务
2:函数调用方式有三种:
函数调用方式1:使用函数名调用函数,执行过程可能和你想象的不一样,函数名首先被转化为一个函数指针,该指针指定函数在内存中的位置,然后,函数调用操作符()调用该函数,执行开始于这个地址的代码。
函数调用方式2:首先对p执行间接访问操作,它把函数指针转化为一个函数名,这个转换并不是真正需要的,因为编译器在执行函数调用操作符之前又会把它转换回去。
函数调用方式3:省去了编译器的隐式转化
因此,通过函数指针调用函数时,最好选择方式3
3:函数指针的用途:
1:回调函数:用户把一个函数指针作为参数传递给其他函数,后者将“回调”用户的函数
2:转移表 :本质:一个函数指针数组
<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:转移表 :本质:一个函数指针数组
相关文章推荐
- POJ——1922 Ride to School
- OCP-V13-039
- UGUI制作Tab标签页
- 协方差计算方法
- ocp-v13-038
- ocp-v13-037
- 20150928所学粗略整理
- 手动实现pow(x,n)的功能--20150927
- HDU 5469(Antonidas-树上匹配字符串)
- ocp-v13-036
- 上千亿的红海市场,如何逆袭出一个新品牌?(80%产品,20%营销,群众路线)
- 沪上各区免费停车场大全
- build.gradle 的设置和相关说明
- HDU 5199/BC 36B Gunner
- 关于Glide——一个高效的图片加载和缓存类库
- [LeetCode-283] Move Zeroes(移动零元素)
- ocp-v13-035
- TFS撤销其他人的迁出
- ios导航栏自定义返回按钮后,多出蓝点bug
- CSS3基础总结