int (*fp)(int a);//這里就定義了一個指向函數的指針 。初學C++ ,以代碼作為學習筆記。
/函數指針
/******************************************************************************************
#include "stdafx.h"
#include <iostream>?
#include <string>?
using namespace std;?
int test(int a);?
int _tmain(int argc,_TCHAR* argv[])???
{?
?cout << test << endl;//顯示函數地址?
?int (*fp)(int a);?
?fp = test;//將函數test的地址賦給函數學指針fp?
?cout << fp(5) << "|" << (*fp)(10) << endl;?
?//上面的輸出fp(5),這是標準c++的寫法,(*fp)(10)這是兼容c語言的標準寫法,兩種同意,但注意區分,避免寫的程序產生移植性問題!?
?return 0;
}?
int test(int a)?
{?
?return a;?
}
******************************************************************************************/
//函數指針,以typedef 形式定義了一個函數指針類型
/******************************************************************************************
#include "stdafx.h"
#include <iostream>?
#include <string>?
using namespace std;?
int test(int a);?
int _tmain(int argc,_TCHAR* argv[])???
{?
?cout<<test<<endl;?
?typedef int (*fp)(int a);//注意,這里不是生命函數指針,而是定義一個函數指針的類型,這個類型是自己定義的,類型名為fp?
?fp fpi;//這里利用自己定義的類型名fp定義了一個fpi的函數指針!?
?fpi=test;?
?cout<<fpi(5)<<"|"<<(*fpi)(10)<<endl;?
?return 0;
}?
int test(int a)?
{?
?return a;?
}
******************************************************************************************/
//函數指針作為參數的情形。
/******************************************************************************************
#include "stdafx.h"
#include <iostream>???
#include <string>
using namespace std;???
int test(int);???
int test2(int (*ra)(int),int);?
int _tmain(int argc,_TCHAR* argv[])?????
{???
?cout << test << endl;?
?typedef int (*fp)(int);???
?fp fpi;?
?fpi = test;//fpi賦予test 函數的內存地址?
?cout << test2(fpi,1) << endl;//這里調用test2函數的時候,這里把fpi所存儲的函數地址(test的函數地址)傳遞了給test2的第一個形參?
?return 0;
}???
int test(int a)?
{???
?return a-1;?
}?
int test2(int (*ra)(int),int b)//這里定義了一個名字為ra的函數指針?
{?
?int c = ra(10)+b;//在調用之后,ra已經指向fpi所指向的函數地址即test函數?
?return c;?
}
******************************************************************************************/
#include "stdafx.h"
#include <iostream>???
#include <string>???
using namespace std;?
void t1(){cout<<"test1";}?
void t2(){cout<<"test2";}?
void t3(){cout<<"test3";}?
int _tmain(int argc,_TCHAR* argv[])?????
{?
?void* a[]={t1,t2,t3};?
?cout<<"比較t1()的內存地址和數組a[0]所存儲的地址是否一致"<<t1<<"|"<<a[0]<<endl;?
?//cout<<a[0]();//錯誤!指針數組是不能利用數組下標操作調用函數的?
?typedef void (*fp)();//自定義一個函數指針類型?
?fp b[]={t1,t2,t3}; //利用自定義類型fp把b[]定義趁一個指向函數的指針數組?
?b[0]();//現在利用指向函數的指針數組進行下標操作就可以進行函數的間接調用了;?
?return 0;
}