回覆列表
-
1 # IT劉小虎
-
2 # 三Ye紙
函式指標和指標函式的區別:
1. 名字解析。這兩個名詞都是帶有修飾的名詞,可以略微擴充套件一下,在中間加個助詞"的",函式的指標和指標的函式;現在看看,稍微清晰了一點,現在再擴充套件一下,加點修飾詞--指向函式的指標和返回值為指標的函式;現在基本明確了。
2. 格式。
Type (* pFunc)(Type para); -- 函式指標
Type* Func(Type para); -- 指標函式
3. 先說指標函式,其實它就是普通函式,只不過返回值是指標(其實就是地址)而已,很多人因為恐懼指標,覺得它神秘!
4. 函式指標。這個有點複雜,首先*和pFunc先結合,優先順序最高,因此pFunc就是指標了,同時這個指標後面帶走一對小括號,裡面還有引數,和函式的引數是一樣的格式,因此這個指標就是函式指標,這個指標前面還有個型別-返回值型別!有人這裡感覺很奇怪,指標怎麼有返回值呢?
5. 指標有返回值,是因為這個指標講來使用的時候,會指向一個格式和它自己類似的函式,因此這個指標的返回值和引數格式就決定了指向的函式的格式!
6. 函式指標要熟練,沒有為啥,必須會,因為函式指標使用的時候體現的是C語言中的聯編特點,也是後來C++語言中多型的雛形!
C語言中有陣列指標和指標陣列,現在又有函式指標和指標函式,初學者看到這裡,可能會覺得C語言是一門喜歡咬文嚼字的程式語言。其實我也比較討厭術語,因為它們總是能夠加大初學者接受相關知識的難度。
不過話說回來,如果能夠理解和掌握C語言指標的基本知識,哪怕第一次聽說這些術語,應該也是能夠理解其含義的,甚至,自己自然而然的也會這麼稱呼它們。
函式指標我們先回顧下陣列指標和指標陣列,題主可看看我之前的回答或者文章,應該會發現只要把“陣列”像“int”一樣看作是一種資料型別,陣列指標和指標陣列就具有很明顯的區別了。
int 指標是指向 int 型資料,那陣列指標就指向陣列的指標。int 陣列是一個存放 int 資料的陣列,那指標陣列就是存放指標的陣列。在C語言中,函式也是一種型別,那函式指標就是指向函式的指標。
函式指標怎麼定義呢?請看下面這個例子:
分析定義函式指標的表示式 void (* f )(char * ) 和分析陣列指標的定義方式是相似的,() 的優先順序高,所以 f 先和 * 結合,因此 f 首先是一個指標,什麼型別呢?
* f 外面是一個函式原型的格式,引數是 char* ,返回值是 void,所以 f 是一個函式型別的指標。而 hello 函式恰好引數是 char* 型別,返回值是 void 型別,因此可以讓 f 指向 hello。也可以寫成:
void (*f)(char *) =&hello;可以透過函式指標呼叫它指向的函式,例如上面的 f(“Jim”),也可以以 (* f)(“Jim”) 的形式呼叫它指向的函式。應該注意到了,單獨寫 f 的時候,它是一個函式指標,並沒有函式呼叫。想呼叫函式,需要加上“()”符號。
可以把 “()”理解為函式呼叫的運算子,它的左側要求是函式指標。
初學者看到這裡,可能有些疑問,例如為什麼初始化 f 時,既可以把 hello 直接賦值給 f,也可以把 &hello 賦值給 f?再例如,為什麼透過 f 呼叫函式時,既可以直接 f(“Jim”),也可以 (* f)(“Jim”)?其實做個試驗就明白了,我們把 &hello,hello,* hello 地址打印出來,請看:
編譯執行,會發現其實這三條C語言程式碼是等價的,所以上面介紹的那些使用方式雖然略有不同,程式也可以正常工作。
不過,使用函式指標時,有些程式設計師更習慣下面這麼用,這樣一眼就能看出使用的是函式指標,當然,究竟使用哪種主要取決於個人習慣。
把 hello 當作函式指標時,使用 &hello。f 是指向函式的指標,透過 f 呼叫函式時,使用 (* f)(…)。現在知道怎麼使用函式指標了,只是,函式指標的定義方式有些繁瑣,如果我想定義多個同樣型別的函式,要寫好多重複程式碼,這不是“不優雅”嗎?的確,應該儘量避免重複程式碼,好在C語言有 typedef 關鍵字。
typedef 關鍵字使得我們可以用其他符號代替較繁瑣的資料型別,例如上例C語言程式碼,我們使用 uchar 符號代替了 “unsigned char”型別,以後想定義 unsigned char 型別的變數,直接用 uchar 就可以了,在上例中,我們用 uchar 定義了一個 unsigned char 型別的變數 i。函式指標的定義方式也可以用 typedef 關鍵詞簡化:
我們使用 FUN 符號代替了函式指標型別,這種函式的引數型別為 char* ,返回值為 void。以後遇到這種型別的函式,直接使用 FUN 符號就可以定義出對應的函式指標。
指標函式似乎又是一個比較陌生的詞,不過相信題主對 int 函式還是挺熟悉的,int 函式是返回 int 資料的函式,那指標函式就是返回指標的函式。、就這麼簡單。下面給出一個指標函式的使用例項,請看相關C語言程式碼:
get_str() 函式返回值是 char 指標型別的,所以 get_str 是一個指標函式。它的呼叫方式和 int 等其他型別函式的呼叫一樣,指標函式實在沒什麼特別的。
總結指標函式是一個函式,它的返回值是指標型別。函式指標是一個指標,它指向函式,透過函式指標可以呼叫它指向的函式,透過函式指標,我們可以讓C語言仿 C++ 實現“類”的封裝,題主可參考我相關的文章。