首页
/
每日頭條
/
圖文
/
c語言中關于指針函數
c語言中關于指針函數
更新时间:2025-05-09 23:22:30
1.函數指針的定義

顧名思義,函數指針就是函數的指針。它是一個指針,指向一個函數。看例子:

c語言中關于指針函數(每日幹貨C語言函數指針的理解與使用)1

看看上面三個表達式分别是什麼意思?

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

B) 也很簡單,與C)表達式相比,唯一不同的就是函數的返回值類型為char**,是個二級指針。

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

int(*)[10] p;

再看看A)表達式與這裡何其相似!明白了吧。這裡fun1不是什麼函數名,而是一個指針變量,它指向一個函數。這個函數有兩個指針類型的參數,函數的返回值也是一個指針。同樣,我們把這個表達式改寫一下:

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

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

2.函數指針使用的例子

上面我們定義了一個函數指針,但如何來使用它呢?先看如下例子:

c語言中關于指針函數(每日幹貨C語言函數指針的理解與使用)2

我們使用指針的時候,需要通過鑰匙(“*”)來取其指向的内存裡面的值,函數指針使用也如此。通過用(*pf)取出存在這個地址上的函數,然後調用它。

這裡需要注意到是,在Visual C 6.0裡,給函數指針賦值時,可以用&fun或直接用函數名fun。這是因為函數名被編譯之後其實就是一個地址,所以這裡兩種用法沒有本質的差别。這個例子很簡單,就不再詳細讨論了。

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

也許上面的例子過于簡單,我們看看下面的例子:

c語言中關于指針函數(每日幹貨C語言函數指針的理解與使用)3

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

别急,先看這行代碼:

void(*p)();

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

&p是求指針變量p本身的地址,這是一個32位的二進制常數(32位系統)。

(int*)&p表示将地址強制轉換成指向int類型數據的指針。

(int)Function表示将函數的入口地址強制轉換成int類型的數據。

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

那麼(*p) ();就是表示對函數的調用。

講解到這裡,相信你已經明白了。其實函數指針與普通指針沒什麼差别,隻是指向的内容不同而已。

使用函數指針的好處在于,可以将實現同一功能的多個模塊統一起來标識,這樣一來更容易後期的維護,系統結構更加清晰。或者歸納為:便于分層設計、利于系統抽象、降低耦合度以及使接口與實現分開。

c語言中關于指針函數(每日幹貨C語言函數指針的理解與使用)4

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

是不是感覺上面的例子太簡單,不夠刺激?好,那就來點刺激的,看下面這個例子:

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

這是《C Traps and Pitfalls》這本經典的書中的一個例子。沒有發狂吧?下面我們就來分析分析:

第一步:void(*) (),可以明白這是一個函數指針類型。這個函數沒有參數,沒有返回值。

第二步:(void(*) ())0,這是将0強制轉換為函數指針類型,0是一個地址,也就是說一個函數存在首地址為0的一段區域内。

第三步:(*(void(*) ())0),這是取0地址開始的一段内存裡面的内容,其内容就是保存在首地址為0的一段區域内的函數。

第四步:(*(void(*) ())0)(),這是函數調用。

好像還是很簡單是吧,上面的例子再改寫改寫:

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

如果沒有上面的分析,肯怕不容易把這個表達式看明白吧。不過現在應該是很簡單的一件事了。讀者以為呢?

5.函數指針數組

  現在我們清楚表達式

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

定義的是一個函數指針pf。既然pf是一個指針,那就可以儲存在一個數組裡。把上式修改一下:

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

這是定義一個函數指針數組。

  它是一個數組,數組名為pf,數組内存儲了3個指向函數的指針。這些指針指向一些返回值類型為指向字符的指針、參數為一個指向字符的指針的函數。

  這念起來似乎有點拗口。不過不要緊,關鍵是你明白這是一個指針數組,是數組。函數指針數組怎麼使用呢?這裡也給出一個非常簡單的例子,隻要真正掌握了使用方法,再複雜的問題都可以應對。

如下:

c語言中關于指針函數(每日幹貨C語言函數指針的理解與使用)5

6.函數指針數組的指針

看着這個标題沒發狂吧?函數指針就夠一般初學者折騰了,函數指針數組就更加麻煩,現在的函數指針數組指針就更難理解了。

其實,沒這麼複雜。前面詳細讨論過數組指針的問題,這裡的函數指針數組指針不就是一個指針嘛。隻不過這個指針指向一個數組,這個數組裡面存的都是指向函數的指針。僅此而已。

下面就定義一個簡單的函數指針數組指針:

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

注意,這裡的pf和上一節的pf就完全是兩碼事了。上一節的pf并非指針,而是一個數組名;這裡的pf确實是實實在在的指針。這個指針指向一個包含了3個元素的數組;這個數字裡面存的是指向函數的指針;這些指針指向一些返回值類型為指向字符的指針、參數為一個指向字符的指針的函數。

  這比上一節的函數指針數組更拗口。其實你不用管這麼多,明白這是一個指針就ok了。其用法與前面講的數組指針沒有差别。下面列一個簡單的例子:

c語言中關于指針函數(每日幹貨C語言函數指針的理解與使用)6

對于零基礎想要更輕松學好C/C 開發語言,這裡也給大家準備了一套系統學習教程資源,幫助大家在學習c語言的道路上披荊斬棘!,關注我頭條号,然後私信我【008】幾個數字免費領取。還有專業的老司機免費答疑!(注意私信我關鍵字不要寫錯,可以複制)

c語言中關于指針函數(每日幹貨C語言函數指針的理解與使用)7

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
新會陳皮的真假辨别方法
新會陳皮的真假辨别方法
晚上好呀,老鐵們。這裡是【小碗獵食中國】最最最前線的信息,這次我們說說新會陳皮。特别說明:以下信息整理于:對産地農戶、經銷者、加工廠的暗訪,然後加上我們的見解,盡量給大家總結了适合大衆的辨别方法。Ps:這次新會我們來考察了陳皮和小青柑,但陳...
2025-05-09
海苔減肥還是增肥
海苔減肥還是增肥
海苔的營養價值1.碘營養豐富,含碘量很高,可用于治療因缺碘引起的“甲狀腺腫大”,有軟堅散結功能,對其他郁結積塊也有用途。2.膽堿和鈣等富含膽堿和鈣、鐵、能增強記憶,治療婦幼貧血,促進骨骼,牙齒的生長和保健;含有一定量的甘露醇,可作為治療水腫...
2025-05-09
甄子丹皇家師姐幕後往事
甄子丹皇家師姐幕後往事
由德寶電影公司制作及出品的“皇家師姐”系列電影,在上世紀八十年代的香港影壇成功開創了一股女性動作片風潮,像後來的《霸王花》系列,《天使行動》系列和《獄鳳》系列,都是在這股風潮的影響之下誕生的同類型作品。如果将1987年的《中華戰士》也算進去...
2025-05-09
蘇東坡身不由己的三個層次
蘇東坡身不由己的三個層次
蘇東坡身不由己的三個層次?圖片作者:周公子|來源:周公子愛讀書(ID:yushanzhaji),今天小編就來說說關于蘇東坡身不由己的三個層次?下面更多詳細答案一起來看看吧!蘇東坡身不由己的三個層次圖片作者:周公子|來源:周公子愛讀書(ID:...
2025-05-09
張小龍微信之父的升級之路
張小龍微信之父的升級之路
2020年微信公開課Pro于今日在廣州正式開課,張小龍雖然缺席本次會議但是他以視頻形式“參會”。據他介紹,微信朋友數量突破了5000人的限制。此前有媒體報道稱微信朋友數上限發生變更,對此張小龍也确認了此則消息。張小龍今日在微信年度大會上表示...
2025-05-09
Copyright 2023-2025 - www.tftnews.com All Rights Reserved