C++知识点10——函数指针

函数指针就是指向函数的指针,和其他指针一样,函数指针也有类型

函数指针的类型由函数的返回值和函数的形参共同决定,与函数名无关,因为只是个名字

 

比如,函数的声明如下:

int funcpointer(double d, string str);

那么函数的类型就是int(double, string),所以函数指针就是int (*pf)(double, string)

函数指针的读法依然是先中间,然后两边,

先看到pf和*,知道这是个指针,看到右侧的(double, string),知道这是形参列表,从而了解该指针指向了一个函数,最后看左边int,知道指向的函数返回值是int

pf两边的括号必不可少,如果没有,那么pf就是函数名,返回一个int型指针

 

函数指针的初始化和赋值

可以直接用函数名给函数指针赋值或初始化,或者在函数名前面加上取地址符号

void testfuncp()
{
      int(*pf)(double, string)=funcpointer;
	int(*pf2)(double,string);
	pf2=funcpointer;
	pf(3.14, "asd");
	*pf2(2.2,"qwe");
}

int funcpointer(double d, string str)
{
	cout<<__func__<<endl;
}

以上代码还显示,可以通过函数指针直接调用函数,而不用解引用,当然,用了解引用符也没什么

 

当给一个函数指针赋值或者初始化时,函数类型必须匹配,否则报错

void testfuncperror()
{
	int(*pf)(double, string)=testfuncp;
}

void testfuncp()
{
	int(*pf)(double, string)=funcpointer;
	int(*pf2)(double,string);
	pf2=funcpointer;
	pf(3.14, "asd");
	pf2(2.2,"qwe");
}

函数指针的作为形参

函数指针作为形参时,传入的函数会被当做指针处理

int main(int argc, char const *argv[])
{
	testfuncpointerpara(twointfunc);
	return 0;
}

void testfuncpointerpara(void (*pf)(int, int))
{
	cout<<__func__<<endl;
	pf(10,20);
}

void twointfunc(int a, int b)
{
	cout<<__func__<<endl;
}

 

返回函数指针

返回函数指针的函数可以按照如下方式进行声明

int (*returnfuncpointer(int a, int b))(int c, int d);

读法依然是先中间,再右,最后左

看中间*returnfuncpointer(int a, int b),知道returnfuncpointer是一个函数,返回的是指针,再看右边有形参列表,知道返回的是函数指针,最后看左边int,知道这个函数指针的指向的函数的返回值是int

int main(int argc, char const *argv[])
{
	int a=10,b=20;
	int (*pf)(int, int)=returnfuncpointer(a,b);
	pf(a,b);
	return 0;
}

int (*returnfuncpointer(int a, int b))(int c, int d)
{
	cout<<__func__<<endl;
	return func;
}

int func(int a, int b)
{
	cout<<a+b<<endl;
	return a+b;
}

上述代码中的函数returnfuncpointer返回一个类型为int (*)(int a, int b)的函数指针,首先用该函数的返回值初始化pf,然后通过pf调用函数func

 

参考:

《C++ Primer》

 

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章