指針函數,函數指針,有點懵圈了?你能分清楚嗎

指針函數和函數指針到底怎麼區分?

1、前言

數組、指針,這兩個詞結合的順序不同,其意義也不同。

同樣的,函數、指針這兩個詞結合的順序不同其意義也不同,即指針函數與函數指針的意義不同


2、指針函數

指針函數的本質是一個函數,其返回值是一個指針。示例如下:

int *pfun(int, int);

由於“ * ”的優先級低於“()”的優先級,因而pfun首先和後面的“()”結合,也就意味著,pfun是一個函數。即:int *(pfun(int, int));

接著再和前面的“*”結合,說明這個函數的返回值是一個指針。由於前面還有一個int,也就是說,pfun是一個返回值為整型指針的函數。

指針函數示例程序如下:

指針函數,函數指針,有點懵圈了?你能分清楚嗎

程序運行結果如下:

指針函數,函數指針,有點懵圈了?你能分清楚嗎

主函數中,把一個數組的首地址與數組長度作為實參傳入指針函數pfun裡,把指針函數的返回值(即指向數組的指針)賦給整形指針p。最後使用指針p來遍歷數組元素並打印輸出。


3、函數指針

函數指針其本質是一個指針變量,該指針變量指向一個函數。C程序在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。函數指針示例:

指針函數,函數指針,有點懵圈了?你能分清楚嗎

func 是一個函數名,那麼func與&func都表示的是函數的入口地址。同樣的,在函數的調用中可以使用:方式一:func(),也可以使用方式二:(*fun)()。這兩種調用方式是等價的,只是我們平時大多都習慣用方式一的調用方法。

至於為什麼func與&func的含義相同:

對於函數func來說,函數的名稱就是函數代碼區的常量,對它取地址(&func)可以得到函數代碼區的地址,同時,fun本身也可以視為函數代碼區的地址。因此,函數名稱和對其取地址其含義是相同的。

函數指針示例程序如下:

指針函數,函數指針,有點懵圈了?你能分清楚嗎

程序運行結果如下:

指針函數,函數指針,有點懵圈了?你能分清楚嗎

以上就是關於指針函數與函數指針的簡單區分。其中,函數指針廣泛應用於嵌入式軟件開發中,其常用的兩個用途:調用函數和做函數的參數。

對於熱愛編程的人來說,有一群一起學習一起解答的小夥伴很重要!筆者有一個編程零基礎入門學習交流俱樂部(群)私信我【編程學習】獲取號,還有學習視頻文件,歡迎初學者和正在進階中的小夥伴們!


分享到:


相關文章: