C++浅析函数指针

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhang_alongzd/article/details/51532928
函数指针,即指向函数的指针,函数其实也就是一个代码块,也有指针,运用函数指针可以实现很多功能;比如调用函数或者用作函数参数(回调函数);
函数指针的声明方法和普通函数略有区别;返回值类型 ( 指针变量名) ([形参列表]);
例如:
int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f = func之后,就可以直接运用(*f) (int x)调用func函数了;:
1: 首先看一个实例:
//
#include "stdafx.h"
#include<iostream>
using namespace std;
int Max(int a,int b);
int (*p)(int,int);

int _tmain(int argc, _TCHAR* argv[])
{
	int i,j;
	cout<<"输入两个正数:"<<endl;
	cin>>i>>j;
	cout<<"调用原函数的返回的最大值:"<<endl;
	cout<<Max(i,j)<<endl;

	p=&Max;
	cout<<"调用指针函数的返回的最大值:"<<endl;
	cout<<(*p)(i,j)<<endl;
	cin.get();
	cin.get();
	return 0;
}

int Max(int a,int b)
{
	return (a>b?a:b);
}
运行结果:



p是指向函数的指针变量 ,所以可把函数Max()赋给p作为p的值,即把Max()的入口地址赋给p,以后就可以用p来调用该函数,实际上p和Max都指向同一个入口地址,不同就是p是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。 不过注意,指向函数的指针变量 没有++和--运算,用时要小心。

2:当函数指针也可以用作另一个函数的参数:
看一段代码:
// FuncPtr.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
double Triangle_area(double&,double&);           //三角形面积;
double Rectangle_area(double&,double&);          //矩形面积;
double print_area(double(*p)(double&,double&),double&,double&);     //把函数指针作为参数传递;

int _tmain(int argc, _TCHAR* argv[])
{
	double a=2,b=3;
	bool quit = false;
	char choice;
	double(*p)(double&,double&);
	while(quit==false)
	{
		cout<<"三角形面积(1)  矩形面积(2)  quit(q)"<<endl;
		cin>>choice;
		switch (choice)
		{
		case 'q':
			quit = true;
			break;
		case '1':
			p=Triangle_area;
			print_area(p,a,b);
			break;
		case '2':
			p = Rectangle_area;
			print_area(p,a,b);
			break;
		default:
			cout<<"请按规矩出牌!"<<endl;
		}		
	}
	//cin.get();
	//cin.get();
	return 0;
}

double Triangle_area(double& a,double& b)
{
	cout<<"三角形面积为:"<<a*b*0.5<<endl;
	return 0;
}
double Rectangle_area(double& a,double& b)
{
	cout<<"矩形面积为:"<<a*b<<endl;
	return 0;
}
double print_area(double(*p)(double& a,double& b),double&a ,double& b)
{
	p(a,b);
	return 0;
}

运行结果如下:





猜你喜欢

转载自blog.csdn.net/zhang_alongzd/article/details/51532928