C/C++指針函數和函數指針

1、指針和函數

一.首先簡要回顧一下指針和函數

函數簡要的說就是完成某一個功能的代碼塊,其由返回值類型+函數名+(形參)還有具體代碼組成(相信大家都懂的!);而指針(指針變量)是一種存放地址(內存單元的編號)的變量,因此通過指針可以指向相應地址中的內容。

2、指針函數

指針函數是指返回值類型是指針類型的函數,實質上就是最終該函數會返回一個地址或地址表達式給調用函數。其本質仍然是函數!

其函數原型爲:類型* 函數名(形式參數表)

如求兩個值中的最大值並返回其地址
在這裏插入圖片描述
輸出結果爲:

000000000065FE48

000000000065FE48

爲什麼兩個地址值是一樣的?請讀者思考一下。

談談其中兩點:

1.返回的指針類型必須和函數的返回值類型一樣,如上面的max函數返回值類型是int 類型,所以return後面必須是int類型

2.返回的指針即地址必須是合法的,指針函數不能返回指針函數中的局部變量,如

int*f(){ int i= 7;return &i;}

則是不合法的,因爲i是個局部變量,其生命週期會隨f函數的結束而終結,當執行完f函數時,i佔的內存會被釋放掉,即其已經沒有地址了。(關於內存的內容,讀者可參考本公衆號的四大內存區域一文)但可以返回合法的地址如全局變量,靜態變量等的地址。

指針函數的作用:

可以在是代碼更簡潔並在一定程度節約內存;如當你需要返回一個數組中的元素時,你就只需返回首元素的地址給調用函數,調用函數即可操作該數組(讓函數返回多個值)。

或者是malloc函數動態分配內存,返回該內存的地址給另外一個函數,另一個函數纔好操作該內存。當然還有其他的作用,請讀者自行在實踐中體會。

3、函數指針

首先幫大家理清幾個概念

1.函數地址

函數,應用程序等是編譯器處理的對象,經過編譯後的函數都是一段代碼,系統隨即爲這段代碼分配一段存儲空間,而這段存儲空間的首地址就是函數的入口地址或者就是我們說的函數指針。(函數是存儲在代碼區的)因此函數指針指向的是相應的函數。

一個已經定義好的函數,其函數名就是他的入口地址或函數指針。那麼有了函數指針的概念後,我們對函數的調用除了用名字的調用方式後,是不是還有別的方式呢?
在這裏插入圖片描述
運行結果:

just test! just test! just test!

4014F0 4014F0 4014F0

爲什麼可以對函數名f進行&等操作且最後輸出的都是一樣的地址?

這是因爲當函數名出現在表達式中時,編譯器會自動將其轉換爲一個指針,該指針指向該函數。(或者粗俗的將函數名認爲是指向自身的指針)因此f,&f和*&f都對應着函數的入口地址。

當一個函數定下來後,其內存空間也就定下來了,也就是說相應的地址也是確定的,即函數名是個地址常量,那麼就可以將其賦給指向函數的指針。

2.函數指針

函數名錶示函數代碼在內存中的直接地址,因此可以用指針變量來獲取函數的地址,所以指向函數的指針變量簡稱爲函數指針。

在介紹函數指針的表示方法前,先來認識一下函數類型。

函數類型是包括了函數的返回值類型和參數類型,它是函數的接口。

如int test1(int*,double )和int test2(int*,double)是同一個類型的函數,float test3(int , int)與test1和test2就不是相同類型的函數。test1和test2的類型接口爲int(int*,double)

我們可以用關鍵字typedef來抽象一種類型的函數,表示方式:

typedef 返回值類型 函數類型名(形式參數類型)

函數類型名是自定義的標識符,即用戶自己定義。

如typedef int f(int*,double)就是int(int*,double)這種函數類型的抽象。

即f代表了int(int*,double)這種類型的函數。

因此可以用f test1,test2;來做test1和test2的原型聲明。

接下來我們介紹函數指針的表示方式:

返回值類型 (*指針變量名)(形式參數類型)

因爲函數指針是指向某一類函數的指針變量,所以也可以這麼表示:

函數類型 *指針類型名

那麼對於多個類型相同的函數指針,我們有啥簡潔的方式表示不?

我們還是用typedef來定義一種指針類型:

typedef int (*P)(int,int)

好了,下面看代碼
在這裏插入圖片描述
輸出結果全爲 2 00000000004015C5

注意

函數指針int(*p)(int,int)中的(*p)括號不能去掉,否則就變成了

Int*p(int,int)指針函數。

4、函數指針應用

我們說了一大串,到底函數指針有什麼用呢?籠統的講有兩點

1.用函數指針調用函數

2.函數指針像普通指針一樣作函數的形式參數

千言萬語不如一個例子實在。

舉例:從鍵盤中輸入算術運算符號和兩個數,輸出這兩個數操作後的結果
在這裏插入圖片描述
輸出結果:

please select your operation(input+or-)+

please input the two operand

3

4

the operation is :3.000000+4.000000=7.000000

當然函數指針還有更高級的作用,如在分層設計和系統抽象的作用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章