天天看點

函數指針和指針函數用法

前言

正文

指針函數

定義

int fun(int x,int y);

int *fun(int x,int y);

f(4,5) = 4 5

調用: data * mydata = static_cast

函數指針和指針函數,在學習 c 語言的時候遇到這兩個東西簡直頭疼,當然還有更頭疼的,比如什麼函數指針函數、指針函數指針、數組指針、指針數組、函數指針數組等等,描述越長其定義就越複雜,當然了解起來就越難,特别是剛開始學習這門語言的童鞋,估計碰到這些東西就已經要崩潰了,然後好不容易死記硬背下來應付考試或者面試,然後過了幾天發現,又是根本不會用,也不知道該在哪些地方用,這就尴尬了。

今天這裡隻講兩個相對簡單的,其實上面說那些太複雜的東西也真的很少用,即便是用了了解起來很麻煩,是以莫不如先深刻了解這兩個比較容易的,并且項目中比較常用到。

先來看看兩者的定義以及說明。

指針函數,簡單的來說,就是一個傳回指針的函數,其本質是一個函數,而該函數的傳回值是一個指針。

聲明格式為:*類型辨別符 函數名(參數表)

這似乎并不難了解,再進一步描述一下。

看看下面這個函數聲明:

這種函數應該都很熟悉,其實就是一個函數,然後傳回值是一個 int 類型,是一個數值。

接着看下面這個函數聲明:

這和上面那個函數唯一的差別就是在函數名前面多了一個*号,而這個函數就是一個指針函數。其傳回值是一個 int 類型的指針,是一個位址。

這樣描述應該很容易了解了,所謂的指針函數也沒什麼特别的,和普通函數對比不過就是其傳回了一個指針(即位址值)而已。

指針函數的寫法

這個寫法看個人習慣,其實如果*靠近傳回值類型的話可能更容易了解其定義。

示例

(由于本人習慣于 qt 中進行開發,是以這裡為了友善,示例是在 qt 工程中寫的,其文法是一樣的,隻是輸出方式不同)

來看一個非常簡單的示例:

輸出如下:

注意:在調用指針函數時,需要一個同類型的指針來接收其函數的傳回值。

不過也可以将其傳回值定義為 void*類型,在調用的時候強制轉換傳回值為自己想要的類型,如下:

其輸出結果是一樣的,不過不建議這麼使用,因為強制轉換可能會帶來風險。

函數指針

函數指針,其本質是一個指針變量,該指針指向這個函數。總結來說,函數指針就是指向函數的指針。

聲明格式:類型說明符 (*函數名) (參數)

如下:

函數指針是需要把一個函數的位址指派給它,有兩種寫法:

取位址運算符&不是必需的,因為一個函數辨別符就表示了它的位址,如果是函數調用,還必須包含一個圓括号括起來的參數表。

調用函數指針的方式也有兩種:

兩種方式均可,其中第二種看上去和普通的函數調用沒啥差別,如果可以的話,建議使用第一種,因為可以清楚的指明這是通過指針的方式來調用函數。當然,也要看個人習慣,如果了解其定義,随便怎麼用都行啦。

上面說到的幾種指派和調用方式我都分别使用了,其輸出結果是一樣的。

二者差別

通過以上的介紹,應該都能清楚的了解其二者的定義。那麼簡單的總結下二者的差別:

指針函數本質是一個函數,其傳回值為指針。

函數指針本質是一個指針,其指向一個函數。

指針函數:int* fun(int x,int y);

函數指針:int (fun)(int x,int y);

可以簡單粗暴的了解為,指針函數的是屬于資料類型的,而函數指針的星号是屬于函數名的。

再簡單一點,可以這樣辨識兩者:函數名帶括号的就是函數指針,否則就是指針函數。

上面已經寫了詳細示例,這裡就不在啰嗦了。

總而言之,這兩個東西很容易搞混淆,一定要深入了解其兩者定義和差別,避免犯錯。

部分取自連結:https://blog.csdn.net/luoyayun361/article/details/80428882

繼續閱讀