最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

C/C++編程筆記:C語(yǔ)言函數(shù)指針的理解與使用,就是這么簡(jiǎn)單明了!

2020-04-21 15:30 作者:C語(yǔ)言編程__Plus  | 我要投稿

1.函數(shù)指針的定義

顧名思義,函數(shù)指針就是函數(shù)的指針。它是一個(gè)指針,指向一個(gè)函數(shù)??蠢樱?/p>

看看上面三個(gè)表達(dá)式分別是什么意思?

C)這很容易,fun3是函數(shù)名,p1,p2是參數(shù),其類(lèi)型為char *型,函數(shù)的返回值為char *類(lèi)型。

B) 也很簡(jiǎn)單,與C)表達(dá)式相比,唯一不同的就是函數(shù)的返回值類(lèi)型為char**,是個(gè)二級(jí)指針。

A) fun1是函數(shù)名嗎?回憶一下前面講解數(shù)組指針時(shí)的情形。我們說(shuō)數(shù)組指針這么定義或許更清晰:

int(*)[10] p;

再看看A)表達(dá)式與這里何其相似!明白了吧。這里fun1不是什么函數(shù)名,而是一個(gè)指針變量,它指向一個(gè)函數(shù)。這個(gè)函數(shù)有兩個(gè)指針類(lèi)型的參數(shù),函數(shù)的返回值也是一個(gè)指針。同樣,我們把這個(gè)表達(dá)式改寫(xiě)一下:

char* (*)(char* p1,char* p2) fun1;

這樣子是不是好看一些呢?只可惜編譯器不這么想。^_^。

2.函數(shù)指針使用的例子

上面我們定義了一個(gè)函數(shù)指針,但如何來(lái)使用它呢?先看如下例子:


  我們使用指針的時(shí)候,需要通過(guò)鑰匙(“*”)來(lái)取其指向的內(nèi)存里面的值,函數(shù)指針使用也如此。通過(guò)用(*pf)取出存在這個(gè)地址上的函數(shù),然后調(diào)用它。

????????這里需要注意到是,在Visual C++6.0里,給函數(shù)指針賦值時(shí),可以用&fun或直接用函數(shù)名fun。這是因?yàn)楹瘮?shù)名被編譯之后其實(shí)就是一個(gè)地址,所以這里兩種用法沒(méi)有本質(zhì)的差別。這個(gè)例子很簡(jiǎn)單,就不再詳細(xì)討論了。

3.*(int*)&p ----這是什么?

也許上面的例子過(guò)于簡(jiǎn)單,我們看看下面的例子:

這是在干什么?*(int*)&p=(int)Function;表示什么意思?

別急,先看這行代碼:

void(*p)();

這行代碼定義了一個(gè)指針變量p,p指向一個(gè)函數(shù),這個(gè)函數(shù)的參數(shù)和返回值都是void。

&p是求指針變量p本身的地址,這是一個(gè)32位的二進(jìn)制常數(shù)(32位系統(tǒng))。

(int*)&p表示將地址強(qiáng)制轉(zhuǎn)換成指向int類(lèi)型數(shù)據(jù)的指針。

(int)Function表示將函數(shù)的入口地址強(qiáng)制轉(zhuǎn)換成int類(lèi)型的數(shù)據(jù)。

分析到這里,相信你已經(jīng)明白*(int*)&p=(int)Function;表示將函數(shù)的入口地址賦值給指針變量p。

那么(*p) ();就是表示對(duì)函數(shù)的調(diào)用。

講解到這里,相信你已經(jīng)明白了。其實(shí)函數(shù)指針與普通指針沒(méi)什么差別,只是指向的內(nèi)容不同而已。

使用函數(shù)指針的好處在于,可以將實(shí)現(xiàn)同一功能的多個(gè)模塊統(tǒng)一起來(lái)標(biāo)識(shí),這樣一來(lái)更容易后期的維護(hù),系統(tǒng)結(jié)構(gòu)更加清晰?;蛘邭w納為:便于分層設(shè)計(jì)、利于系統(tǒng)抽象、降低耦合度以及使接口與實(shí)現(xiàn)分開(kāi)。

4.(*(void(*) ())0)()------這是什么?

是不是感覺(jué)上面的例子太簡(jiǎn)單,不夠刺激?好,那就來(lái)點(diǎn)刺激的,看下面這個(gè)例子:

(*(void(*) ())0)();

這是《C Traps and Pitfalls》這本經(jīng)典的書(shū)中的一個(gè)例子。沒(méi)有發(fā)狂吧?下面我們就來(lái)分析分析:

第一步:void(*) (),可以明白這是一個(gè)函數(shù)指針類(lèi)型。這個(gè)函數(shù)沒(méi)有參數(shù),沒(méi)有返回值。

第二步:(void(*) ())0,這是將0強(qiáng)制轉(zhuǎn)換為函數(shù)指針類(lèi)型,0是一個(gè)地址,也就是說(shuō)一個(gè)函數(shù)存在首地址為0的一段區(qū)域內(nèi)。

第三步:(*(void(*) ())0),這是取0地址開(kāi)始的一段內(nèi)存里面的內(nèi)容,其內(nèi)容就是保存在首地址為0的一段區(qū)域內(nèi)的函數(shù)。

第四步:(*(void(*) ())0)(),這是函數(shù)調(diào)用。

好像還是很簡(jiǎn)單是吧,上面的例子再改寫(xiě)改寫(xiě):

(*(char**(*) (char**,char**))0) ( char**,char**);

如果沒(méi)有上面的分析,肯怕不容易把這個(gè)表達(dá)式看明白吧。不過(guò)現(xiàn)在應(yīng)該是很簡(jiǎn)單的一件事了。讀者以為呢?

5.函數(shù)指針數(shù)組

  現(xiàn)在我們清楚表達(dá)式

char* (*pf)(char* p);

定義的是一個(gè)函數(shù)指針pf。既然pf是一個(gè)指針,那就可以?xún)?chǔ)存在一個(gè)數(shù)組里。把上式修改一下:

char* (*pf[3])(char* p);

這是定義一個(gè)函數(shù)指針數(shù)組。

  它是一個(gè)數(shù)組,數(shù)組名為pf,數(shù)組內(nèi)存儲(chǔ)了3個(gè)指向函數(shù)的指針。這些指針指向一些返回值類(lèi)型為指向字符的指針、參數(shù)為一個(gè)指向字符的指針的函數(shù)。

  這念起來(lái)似乎有點(diǎn)拗口。不過(guò)不要緊,關(guān)鍵是你明白這是一個(gè)指針數(shù)組,是數(shù)組。函數(shù)指針數(shù)組怎么使用呢?這里也給出一個(gè)非常簡(jiǎn)單的例子,只要真正掌握了使用方法,再?gòu)?fù)雜的問(wèn)題都可以應(yīng)對(duì)。

如下:


6.函數(shù)指針數(shù)組的指針

看著這個(gè)標(biāo)題沒(méi)發(fā)狂吧?函數(shù)指針就夠一般初學(xué)者折騰了,函數(shù)指針數(shù)組就更加麻煩,現(xiàn)在的函數(shù)指針數(shù)組指針就更難理解了。

其實(shí),沒(méi)這么復(fù)雜。前面詳細(xì)討論過(guò)數(shù)組指針的問(wèn)題,這里的函數(shù)指針數(shù)組指針不就是一個(gè)指針嘛。只不過(guò)這個(gè)指針指向一個(gè)數(shù)組,這個(gè)數(shù)組里面存的都是指向函數(shù)的指針。僅此而已。

下面就定義一個(gè)簡(jiǎn)單的函數(shù)指針數(shù)組指針:

char* (*(*pf)[3])(char* p);

注意,這里的pf和上一節(jié)的pf就完全是兩碼事了。上一節(jié)的pf并非指針,而是一個(gè)數(shù)組名;這里的pf確實(shí)是實(shí)實(shí)在在的指針。這個(gè)指針指向一個(gè)包含了3個(gè)元素的數(shù)組;這個(gè)數(shù)字里面存的是指向函數(shù)的指針;這些指針指向一些返回值類(lèi)型為指向字符的指針、參數(shù)為一個(gè)指向字符的指針的函數(shù)。

  這比上一節(jié)的函數(shù)指針數(shù)組更拗口。其實(shí)你不用管這么多,明白這是一個(gè)指針就ok了。其用法與前面講的數(shù)組指針沒(méi)有差別。下面列一個(gè)簡(jiǎn)單的例子:

學(xué)習(xí)C/C++編程知識(shí),提升自己的C/C++編程能力,歡迎關(guān)注UP,UP上傳了一些C/C++的學(xué)習(xí)教程,有興趣的小伙伴可以看一下~

C/C++編程筆記:C語(yǔ)言函數(shù)指針的理解與使用,就是這么簡(jiǎn)單明了!的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
贵德县| 密云县| 开远市| 清水河县| 安国市| 黔西| 彰武县| 锡林郭勒盟| 改则县| 潞城市| 台东市| 鄂尔多斯市| 永新县| 丹东市| 甘德县| 庄河市| 皋兰县| 岳普湖县| 铁岭市| 苍梧县| 阜新市| 青州市| 沅陵县| 佛山市| 宁远县| 渑池县| 汝州市| 青岛市| 义乌市| 鄂尔多斯市| 营山县| 茶陵县| 嵊州市| 临邑县| 金华市| 建宁县| 邯郸县| 揭西县| 霍山县| 高阳县| 台安县|