函數(shù)存放在內(nèi)存的代碼區(qū)域內(nèi),它們同樣有地址,我們?nèi)绾文塬@得函數(shù)的地址呢?
如果我們有一個int test(int a)的函數(shù),那么,它的地址就是函數(shù)的名字,這一點如同數(shù)組一樣,數(shù)組的名字就是數(shù)組的起始地址。
定義一個指向函數(shù)的指針用如下的形式,以上面的test()為例:
int (*fp)(int a);//這里就定義了一個指向函數(shù)的指針
函數(shù)指針不能絕對不能指向不同類型,或者是帶不同形參的函數(shù),在定義函數(shù)指針的時候我們很容易犯如下的錯誤。
int *fp(int a);//這里是錯誤的,因為按照結(jié)合性和優(yōu)先級來看就是先和()結(jié)合,然后變成了一個返回整形指針的函數(shù)了,而不是函數(shù)指針,這一點尤其需要注意!
下面我們來看一個具體的例子:
#include
#include
using namespace std;
int test(int a);
void main(int argc,char* argv[])
{
cout< int (*fp)(int a);
fp=test;//將函數(shù)test的地址賦給函數(shù)學(xué)指針fp
cout< //上面的輸出fp(5),這是標準c++的寫法,(*fp)(10)這是兼容c語言的標準寫法,兩種同意,但注意區(qū)分,避免寫的程序產(chǎn)生移植性問題!
cin.get();
}
int test(int a)
{
return a;
}
typedef定義可以簡化函數(shù)指針的定義,在定義一個的時候感覺不出來,但定義多了就知道方便了,上面的代碼改寫成如下的形式:
#include
#include
using namespace std;
int test(int a);
void main(int argc,char* argv[])
{
cout< typedef int (*fp)(int a);//注意,這里不是生命函數(shù)指針,而是定義一個函數(shù)指針的類型,這個類型是自己定義的,類型名為fp
fp fpi;//這里利用自己定義的類型名fp定義了一個fpi的函數(shù)指針!
fpi=test;
cout< cin.get();
}
int test(int a)
{
return a;
}
函數(shù)指針同樣是可以作為參數(shù)傳遞給函數(shù)的,下面我們看個例子,仔細閱讀你將會發(fā)現(xiàn)它的用處,稍加推理可以很方便我們進行一些復(fù)雜的編程工作。
//-------------------該例以上一個例子作為基礎(chǔ)稍加了修改-----------------------------
#include
#include
using namespace std;
int test(int);
int test2(int (*ra)(int),int);
void main(int argc,char* argv[])
{
cout< typedef int (*fp)(int);
fp fpi;
fpi=test;//fpi賦予test 函數(shù)的內(nèi)存地址
cout< cin.get();
}
int test(int a)
{
return a-1;
}
int test2(int (*ra)(int),int b)//這里定義了一個名字為ra的函數(shù)指針
{
int c=ra(10)+b;//在調(diào)用之后,ra已經(jīng)指向fpi所指向的函數(shù)地址即test函數(shù)
return c;
}
利用函數(shù)指針,我們可以構(gòu)成指針數(shù)組,更明確點的說法是構(gòu)成指向函數(shù)的指針數(shù)組,這么說可能就容易理解的多了。
#include
#include
using
如果我們有一個int test(int a)的函數(shù),那么,它的地址就是函數(shù)的名字,這一點如同數(shù)組一樣,數(shù)組的名字就是數(shù)組的起始地址。
定義一個指向函數(shù)的指針用如下的形式,以上面的test()為例:
int (*fp)(int a);//這里就定義了一個指向函數(shù)的指針
函數(shù)指針不能絕對不能指向不同類型,或者是帶不同形參的函數(shù),在定義函數(shù)指針的時候我們很容易犯如下的錯誤。
int *fp(int a);//這里是錯誤的,因為按照結(jié)合性和優(yōu)先級來看就是先和()結(jié)合,然后變成了一個返回整形指針的函數(shù)了,而不是函數(shù)指針,這一點尤其需要注意!
下面我們來看一個具體的例子:
#include
#include
using namespace std;
int test(int a);
void main(int argc,char* argv[])
{
cout<
fp=test;//將函數(shù)test的地址賦給函數(shù)學(xué)指針fp
cout<
cin.get();
}
int test(int a)
{
return a;
}
typedef定義可以簡化函數(shù)指針的定義,在定義一個的時候感覺不出來,但定義多了就知道方便了,上面的代碼改寫成如下的形式:
#include
#include
using namespace std;
int test(int a);
void main(int argc,char* argv[])
{
cout<
fp fpi;//這里利用自己定義的類型名fp定義了一個fpi的函數(shù)指針!
fpi=test;
cout<
}
int test(int a)
{
return a;
}
函數(shù)指針同樣是可以作為參數(shù)傳遞給函數(shù)的,下面我們看個例子,仔細閱讀你將會發(fā)現(xiàn)它的用處,稍加推理可以很方便我們進行一些復(fù)雜的編程工作。
//-------------------該例以上一個例子作為基礎(chǔ)稍加了修改-----------------------------
#include
#include
using namespace std;
int test(int);
int test2(int (*ra)(int),int);
void main(int argc,char* argv[])
{
cout<
fp fpi;
fpi=test;//fpi賦予test 函數(shù)的內(nèi)存地址
cout<
}
int test(int a)
{
return a-1;
}
int test2(int (*ra)(int),int b)//這里定義了一個名字為ra的函數(shù)指針
{
int c=ra(10)+b;//在調(diào)用之后,ra已經(jīng)指向fpi所指向的函數(shù)地址即test函數(shù)
return c;
}
利用函數(shù)指針,我們可以構(gòu)成指針數(shù)組,更明確點的說法是構(gòu)成指向函數(shù)的指針數(shù)組,這么說可能就容易理解的多了。
#include
#include
using