C語(yǔ)言的那些小秘密之函數指針
我們經(jīng)常會(huì )聽(tīng)到這樣的說(shuō)法,不懂得函數指針就不是真正的C語(yǔ)言高手。我們不管這句話(huà)對與否,但是它都從側面反應出了函數指針的重要性,所以我們還是有必要掌握對函數指針的使用。先來(lái)看看函數指針的定義吧。
本文引用地址:http://dyxdggzs.com/article/270442.htm函數是由執行語(yǔ)句組成的指令序列或者代碼,這些代碼的有序集合根據其大小被分配到一定的內存空間中,這一片內存空間的起始地址就成為函數的地址,不同的函數有不同的函數地址,編譯器通過(guò)函數名來(lái)索引函數的入口地址,為了方便操作類(lèi)型屬性相同的函數,c/c++引入了函數指針,函數指針就是指向代碼入口地址的指針,是指向函數的指針變量。 因而“函數指針”本身首先應該是指針變量,只不過(guò)該指針變量指向函數。這正如用指針變量可指向整形變量、字符型、數組一樣,這里是指向函數。C在編譯時(shí),每一個(gè)函數都有一個(gè)入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變量后,可用該指針變量調用函數,就如同用指針變量可引用其他類(lèi)型變量一樣,在這些概念上是一致的。函數指針有兩個(gè)用途:調用函數和做函數的參數。
函數指針的聲明方法為:
數據類(lèi)型標志符 (指針變量名) (形參列表);
“函數類(lèi)型”說(shuō)明函數的返回類(lèi)型,由于“()”的優(yōu)先級高于“*”,所以指針變量名外的括號必不可少,后面的“形參列表”表示指針變量指向的函數所帶的參數列表。例如:
int function(int x,int y); /* 聲明一個(gè)函數 */
int (*f) (int x,int y); /* 聲明一個(gè)函數指針 */
f=function; /* 將function函數的首地址賦給指針f */
賦值時(shí)函數function不帶括號,也不帶參數,由于function代表函數的首地址,因此經(jīng)過(guò)賦值以后,指針f就指向函數function(int x,int y);的代碼的首地址。
下面的程序說(shuō)明了函數指針調用函數的方法:
例一、
#include
int max ( int x, int y){ return x>y?x:y;}
int min ( int x, int y){ return x
void main ()
{ int ( *f ) ( int x, int y)=max;
//f=&max;
printf ( "%d,%dt", max (2,6), (f)(5,4));
f=min;
printf (" %d,%dt" , min (2,6), (f)(5,4));
}
注意:以上代碼的紅色部分我們將會(huì )在接下來(lái)的代碼分析部分進(jìn)行講解,讀者也可以思考下如果運行注釋部分,結果是否還是正確的呢?
f是指向函數的指針變量,所以可把函數max()賦給f作為f的值,即把max()的入口地址賦給f,以后就可以用f來(lái)調用該函數,實(shí)際上f和max都指向同一個(gè)入口地址,不同就是f是一個(gè)指針變量,不像函數名稱(chēng)那樣是死的,它可以指向任何函數,就看你想怎么做了。在程序中把哪個(gè)函數的地址賦給它,它就指向哪個(gè)函數。而后用指針變量調用它,因此可以先后指向不同的函數。不過(guò)注意,指向函數的指針變量沒(méi)有++和--運算,用時(shí)要小心。
函數括號中的形參可有可無(wú),視情況而定,不過(guò),在某些編譯器中這是不能通過(guò)的。這個(gè)例子的補充如下。
1.定義函數指針類(lèi)型:
typedef int (*fun_ptr)(int,int);
2.申明變量,賦值:
fun_ptr max_func=max;
也就是說(shuō),賦給函數指針的函數應該和函數指針所指的函數原型是一致的。
例二、
#include
void FileFunc()
{
printf("FileFuncn");
}
void EditFunc()
{
printf("EditFuncn");
}
void main()
{
typedef void (*funcp)();
funcp pfun= FileFunc;
pfun();
pfun = EditFunc;
pfun();
}
看了上面兩段代碼,應該都知道如何用函數指針來(lái)調用函數了,但是我們剛剛在上面的描述中留下過(guò)一個(gè)問(wèn)題,就是運行注釋部分f=&max;結果是否還是正確的呢?下面我就給出上面兩個(gè)運行結果的對別,然后來(lái)分析下原因。
c語(yǔ)言相關(guān)文章:c語(yǔ)言教程
c++相關(guān)文章:c++教程
評論