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

    <span style="font-family:KaiTi_GB2312;font-size:18px;">
    #include<iostream>
    #include<cstdlib>
    using namespace std;
   
    int func()
    {
    	cout << "my name is tzw" << 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一般不常用.

2:函数调用方式有三种

函数调用方式1:使用函数名调用函数,执行过程可能和你想象的不一样,函数名首先被转化为一个函数指针,该指针指定函数在内存中的位置,然后,函数调用操作符()调用该函数,执行开始于这个地址的代码。

函数调用方式2:首先对p执行间接访问操作,它把函数指针转化为一个函数名,这个转换并不是真正需要的,因为编译器在执行函数调用操作符之前又会把它转换回去

函数调用方式3:省去了编译器的隐式转化
因此,通过函数指针调用函数时,最好选择方式3

3:函数指针的用途:
1:回调函数:用户把一个函数指针作为参数传递给其他函数,后者将“回调”用户的函数
例如:qsort()标准库快速排序函数;
原型:void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
参 数:
(待排序数组首地址,数组中待排序元素数量,各元素的占用空间大小,指向函数的指针:用于确定排序的顺序)

2:转移表  :本质:一个函数指针数组

例如:double (*oper_func[])(double, double) = {add, sub, mul, div};  调用:oper_func[i](p1, p2)。

4:函数指针与指针函数的区别:

函数指针:int (*p)() 指针p指向函数,又函数名具有地址概念,初始化:int (*p)() = func; 调用:p()提高运算效率!
指针函数: int *p()   由符号优先级()高于*可知:p()是一个函数,该函数返回值是指针类型!



=
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值