天天看點

C++淺析函數指針

函數指針,即指向函數的指針,函數其實也就是一個代碼塊,也有指針,運用函數指針可以實作很多功能;比如調用函數或者用作函數參數(回調函數); 函數指針的聲明方法和普通函數略有差別;傳回值類型 ( 指針變量名) ([形參清單]); 例如: 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);
}
           

運作結果:

C++淺析函數指針

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;
}
           

運作結果如下:

C++淺析函數指針

繼續閱讀