函数指针的使用

函数指针的初始化、调用方式

#include<iostream>
#include<cstdlib>
using namespace std;
 
int func()
{
	cout << "my name is yzy" << endl;
	return 0;
}
 
int main()
{
	int(*p)() = func;   //函数指针初始化方式1;由编译器完成函数名转化为函数指针隐式转换;
	int(*p1)() = &func; //函数指针初始化方式2;&显示转换;
 
	func();//函数调用方式1:函数名直接调用,编译时会现将函数名转化为函数指针;
	(*p)();//函数调用方式2:函数指针转化为函数名,再调用,编译时会现将函数名再转化为函数指针;
	p();   //函数调用方式3:函数指针直接调用
 
	system("pause");
	return 0;
}

 

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

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

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

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

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

函数调用方式3:省去了编译器的隐式转化

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

 

3:函数指针的用途:

1:回调函数:用户把一个函数指针作为参数传递给其他函数,后者将“回调”用户的函数

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

 

函数指针放置到map中

 

#include<iostream>
#include<string>
#include<map>
using namespace std;
typedef void(*test)(void);
void displayone()
{
        cout << "one" << endl;
}
void displaytwo()
{
        cout << "two" << endl;
}
int main(int argc, char* argv[])
{
        map<int, test> testMap;
        pair<int,test> p1 = make_pair(1,displayone);
        pair<int,test> p2 = make_pair(2,displaytwo);
        testMap.insert(p1);
        testMap.insert(p2);

        testMap[1]();
        (*testMap[2])();

        system("pause");
}

函数指针放在数组中

函数指针数组

/**定义函数**/
void funtion0( void );
……..
void funtion255(void );


/**定义函数指针数组**/

void (*fun[256])(void);
 
fun[0] = function0;
…….
fun[255] = function();


/**执行对应函数**/
int func_code ;
func_code = 10;
(*fun[func_code])();

参考:C++中函数指针数组的妙用 https://blog.youkuaiyun.com/weixin_30619101/article/details/98229191

用以代替if else, switch case 等语句,简化代码,提升执行效率。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值