函數指針的定義_第1頁
函數指針的定義_第2頁
函數指針的定義_第3頁
函數指針的定義_第4頁
函數指針的定義_第5頁
已閱讀5頁,還剩1頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1.函數指針的定義顧名思義,函數指針就是函數的指針。它是一個指針,指向一個函數。看例子:看看上面三個表達式分別是什么意思?C)這很容易,fun3是函數名,pi,P2是參數,其類型為char*型,函數的返回值為char*類型。B)也很簡單,與C)表達式相比,唯一不同的就是函數的返回值類型為char**,是個二級指針。A)funi是函數名嗎?回憶一下前面講解數組指針時的情形。我們說數組指針這么定義或許更清晰:再看看A)表達式與這里何其相似!明白了吧。這里funi不是什么函數名,而是一個指針變量,它指向一個函數。這個函數有兩個指針類型的參數,函數的返回值也是一個指針。同樣,我們把這個表達式改寫一下:這樣子是不是好看一些呢?只可惜編譯器不這么想。人—屋.函數指針使用的例子上面我們定義了一個函數指針,但如何來使用它呢?先看如下例子:我們使用指針的時候,需要通過鑰匙(取*)其來取其指向的內存里面的值,函數指針使用也如此。通過用(*pf)取出存在這個地址上的函數,然后調用它。這里需要注意到是,在VisualC++6.0里,給函數指針賦值時,可以用&un或直接用函數名fun。這是因為函數名被編譯之后其實就是一個地址,所以這里兩種用法沒有本質的差別。這個例子很簡單,就不再詳細討論了。.*(int*)&p 這是什么?也許上面的例子過于簡單,我們看看下面的例子:這是在干什么?*(int*)&p=(int)Function;表示什么意思?別急,先看這行代碼:這行代碼定義了一個指針變量p,p指向一個函數,這個函數的參數和返回值都是void。&p是求指針變量p本身的地址,這是一個32位的二進制常數(32位系統)。(int*)&p表示將地址強制轉換成指向int類型數據的指針。(int)Function表示將函數的入口地址強制轉換成int類型的數據。分析到這里,相信你已經明白*(int*)&p=(int)Function;表示將函數的入口地址賦值給指針變量p。那么(*p)();就是表示對函數的調用。講解到這里,相信你已經明白了。其實函數指針與普通指針沒什么差別,只是指向的內容不同而已。使用函數指針的好處在于,可以將實現同一功能的多個模塊統一起來標識,這樣一來更容易后期的維護,系統結構更加清晰。或者歸納為:便于分層設計、利于系統抽象、降低耦合度以及使接口與實現分開。.(*(void(*)())0)() 這是什么?是不是感覺上面的例子太簡單,不夠刺激?好,那就來點刺激的,看下面這個例子:這是《CTrapsandPitfalls》這本經典的書中的一個例子。沒有發狂吧?下面我們就來分析分析:第一步: ,可以明白這是一個函數指針類型。這個函數沒有參數,沒有返回值。第二步: ,這是將強制轉換為函數指針類型,是一個地址,也就是說一個函段區域內。第三步: ,這是取地址開始的一段內存里面的內容,其內容就是保存在首地函數。第四步: ,這是函數調用。好像還是很簡單是吧,上面的例子再改寫改寫:如果沒有上面的分析,肯怕不容易把這個表達式看明白吧。不過現在應該是很簡單的一件事了。讀者以為呢?.函數指針數組現在我們清楚表達式定義的是一個函數指針pf。既然pf是一個指針,那就可以儲存在一個數組里。把上式修改一下:這是定義一個函數指針數組。它是一個數組,數組名為pf,數組內存儲了3個指向函數的指針。這些指針指向一些返回值類型為指向字符的指針、參數為一個指向字符的指針的函數。這念起來似乎有點拗口。不過不要緊,關鍵是你明白這是一個指針數組,是數組。函數指針數組怎么使用呢?這里也給出一個非常簡單的例子,只要真正掌握了使用方法,再復雜的問題都可以應對。如下:可以直接用函數名可以用函數名加上取地址符6函.數指針數組的指針看著這個標題沒發狂吧?函數指針就夠一般初學者折騰了,函數指針數組就更加麻煩,現在的函數指針數組指針就更難理解了。其實,沒這么復雜。前面詳細討論過數組指針的問題,這里的函數指針數組指針不就是一個指針嘛。只不過這個指針指向一個數組,這個數組里面存的都是指向函數的指針。僅此而已。下面就定義一個簡單的函數指針數組指針:注意,這里的pf和上一節的pf就完全是兩碼事了。上一節的pf并非指針,而是一個數組名;這里的pf確實是實實在在的指針。這個指針指向一個包含了3個元素的數組;這個數字里面存的是指向函數的指針;這些指針指向一些返回值類型為指向字符的指針、參數為一個指向字符的指針的函數。這比上一節的函數指針數組更拗口。其實你不用管這么多,明白這是一個指針就ok了

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論