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