歡迎指正
代碼寫的不夠規范: 目的是縮短文章篇幅,實際中請注意
閱讀完本文, 你一定能判斷和寫出:指針函數和函數指針。
0、結論
A、指針函數: 函數的返回值是指針類型
B、函數指針: 函數名是一個指針
1、分析
A、一定出現在函數。
B、關鍵詞: 函數和指針。
C、 函數, 包括返回值類型、函數名、函數參數
D、指針: 地址運算符* 和 指針變量
E、排除函數參數。那么就剩下 函數返回值類型 和 函數名了。
F 、函數和變量一樣,也是有地址的。 函數名就是函數的地址。
一個例子:xcode輸出main函數和add函數的地址
2、形式
先給出形式,下面再解釋。
A、 指針函數
聲明格式: 類型說明符 * 函數名(參數);
舉例:
char* get_buf(); |
這是一個指針函數的聲明, 函數的返回類型是 char* , 函數名:get_buf, 沒有參數需要傳入。
B、函數指針
聲明格式:類型說明符 (*指針變量名)(參數); 或者 typedef 類型說明符 (*指針變量名)(參數);
舉例:
typedef char (*pfunc)(); |
這是一個函數指針的聲明格式,返回類型為char, 函數名是一個指針,無參數需要傳入。
3、解讀
方法: 解讀順序:根據聲明,從左到右依次解讀。關鍵: *與什么結合
A、指針函數 舉例: char* get_buf();
首先, 整體判斷,這是一個函數。 那我們找找函數的返回值類型,函數名,參數。
返回值: char*
函數名: get_buf
參數:無
這里,char 與 * 結合形成整體,表示的是函數的返回值類型。 不要理解錯: * 不是與函數名get_buf先結合。 指針的地址運算符在前,函數名在后,連起來: 指針函數, 這是一個返回值為char*的函數,沒有參數需要傳入。
B、函數指針, 舉例: int (*pfunc)();
首先,整體判斷,這是一個函數。 找找函數的返回值類型 、函數名、參數
返回值類型: int
函數名:(*func)
參數:無
這里:*與pfunc結合,形成指針。 和平常常見的函數不一樣。 比普通的函數名多了一個指針的地址解析運算符*。 將*pfunc視為整體,這個整體表示的是函數名,也就是說,用一個指針代替了原來的函數名。 函數指針: 函數名是一個指針。 函數也有地址,這里只使用一個指針指向了函數的地址。
4、一個例子
// 指針函數 int* get_result() { static int index = 100; return &index; }
// 用作舉例函數指針使用 int get_id() { static int index = 1; return index++; }
// 用一個函數指針指向上面的get_id函數 typedef int (*pfunc)();
int main(int argc, const char * argv[]) { std::cout << "1、輸出指針函數結果:" << *(get_result()) << std::endl;
std::cout << "\n2、下面演示調用函數指針輸出:"; pfunc pget_id_func = get_id; std::cout << pget_id_func() << std::endl; return 0; } |
結果: