函式指標是啥?

2021-10-14 08:00:34 字數 1365 閱讀 1896

我們知道普通變數在定義的時候,編譯器就會自動分配一塊適合的記憶體。函式也是同樣的,編譯的時候會將乙個函式編譯好,然後放在一塊記憶體中。

(上面這段說法實際很不準確,因為編譯器不會分配記憶體,編譯好的**也是以二進位制的形式放在磁碟上,只有程式開始執行時才會載入到記憶體)

如果我們把函式的首位址也儲存在某個指標變數裡,就可以通過這個指標變數來呼叫所指向的函式了,這個儲存函式首位址的特殊指標就叫做函式指標

比如有乙個函式int func(int a);

我們如何宣告乙個可以指向 func 的函式指標呢?

int (*func_p)(int);

看起來有點奇怪,其實函式指標變數的宣告格式和同函式 func 的宣告一樣,只不過把 func 換成(*func_p)罷了。

為什麼要括號呢?因為不要括號的話 int *func_p(int); 就是宣告乙個返回指標的函式了,括號就是為了避免這種歧義

我們來多看幾個函式指標的宣告吧:

int (*f1)(int); // 傳入int,返回int 

void (*f2)(char*); //傳入char指標,沒有返回值

double* (*f3)(int, int); //傳遞兩個整數,返回 double指標

來看乙個函式指標的具體用處吧:

# include typedef void (*work)() work; // typedef 定義一種函式指標型別

void xiaobei_work()

void shuaibei_work()

void do_work(work worker)

int main(void)

輸出:

小北工作就是寫**

帥北工作就是摸魚

其實這裡有點為了用函式指標而用了,不過大家應該體會到了,函式指標最大的優點就是將函式變數化了。

我們可以將函式作為引數傳遞給其它函式,於是就有了多型的雛形。我們可以傳遞不同的函式來實現不同的行為。

void qsort(void* base, size_t num, size_t width, int(*compare)(const void*,const void*))
這是 c 標準庫中 qsort 函式的申明,它最後乙個引數就要求傳入乙個函式指標,這個函式指標負責比較兩個 element。

因為兩個元素的比較方式只有呼叫者才知道,所以這裡需要以函式指標的形式告訴 qsort 如何去判定兩個元素的大小。

好了,函式指標就簡單介紹到這裡。

啥 啥 啥,服務治理是個啥

首先,先說下服務治理的邊界,本質上任何能提公升服務可用性,效能,讓服務更穩定等等,只要是能讓服務執行的更好,都屬於服務治理的範疇。服務治理比較常見的話題 服務發現,服務變更管理,服務監控,服務擴容縮容,服務自我保護,服務降級,服務授權防攻擊,服務上線驗證和灰度發布,服務問題定位和跟蹤,服務負載,服務...

啥是佩奇?哦不,啥是佇列

一天,一群小可愛們在排隊買奶茶。店主認識第乙個小可愛,給他打了骨折 大霧 小可愛買到了奶茶,他快樂的 真的?離開了。其他人往前挪一位 然後,目前排在第一位的小可愛買了奶茶,一蹦一跳的離開了 接下來,其他人往前挪一位 這樣進行下去,最後,只剩下了一位小可愛,他買了奶茶,興沖沖的離開了 沒有人啦!奶茶店...

愛情是個啥

其實起了這個名字有些勉為其難,只是因為上午乘公車看了一篇有關愛情的採訪,受訪者是乙個學者。緣起是乙份抽樣調查。看了其間的內容腦海裡忽然產生了這個問題,所以就以此為題目了。文章中提到的調查資料顯示現在人們獲得的愛情好像是越來越少了,因為人們對愛情的追求越來越高。現代社會傳播 溝通 交流的渠道越來越多,...