12 返回指標的函式 指向函式的指標

2022-02-23 23:13:08 字數 1846 閱讀 5762

接下來我只講指標的最常見用法,比如這一章的內容----返回指標的函式指向函式的指標

指標也是c語言中的一種資料型別,因此乙個函式的返回值肯定可以是指標型別的。

返回指標的函式的一般形式為型別名 * 函式名(引數列表) eg:char * upper(引數){} 返回指向char型的指標變數

比如下面這個函式,返回乙個指向char型別變數的指標

1 // 需求:將字串str中的小寫字母變成大寫字母,並返回改變後的字串

2 // 注意的是:這裡的引數要傳字串變數,不能傳字串常量

3 char * upper(char *str)

14

15 // 遍歷下乙個字元

16 str++;

17 }

18

19 // 返回字串

20 return dest;

21 }

裡面的**我就不詳細解釋了,重點看第2行的定義形式。

呼叫這個函式也非常簡單:

int main()

輸出結果:

看到這個標題,你可能覺得很詫異,指標竟然可以指向乙個函式,那我就先解釋一下為什麼指標可以指向乙個函式

函式作為一段程式,在記憶體中也要佔據部分儲存空間,它也有乙個起始位址,即函式的入口位址。函式有自己的位址,那就好辦了,我們的指標變數就是用來儲存位址的。因此,可以利用乙個指標指向乙個函式。其中,函式名就代表著函式的位址。

定義的一般形式:函式的返回值型別 (*指標變數名)(形式引數1, 形式引數2, ...);

注意:形式引數的變數名可以省略,甚至整個形式引數列表都可以省略

1 #include 2 

3 int sum(int a, int b)

6 7 int main()

8

* 第10行定義了乙個指向sum函式的指標變數p。p的定義形式為:int (*p)(int a, int b),第1個int代表sum函式的返回值是int型別,然後*p是用括號()包住的,後面的int a和int b代表著sum函式的形參,其實完全可以省略。第10行、11行、12行都是可行

* 在第15行,先利用*p取出指向的函式,再傳入引數呼叫函式。也可以採用第16行中的做法,這樣就跟呼叫普通函式沒什麼區別

最後的輸出結果:

,毫無意外

2> 返回指標的函式的定義char *upper(char *str) 和 指向函式的指標的定義int (*p)(int a, int b)非常相似,使用時特別注意區分

3> 指向函式的指標變數主要有兩個用途:

1 #include 2 

3 // 減法運算

4 int minus(int a, int b)

7 8 // 加法運算

9 int sum(int a, int b)

12 13 // 這個counting函式是用來做a和b之間的計算,至於做加法還是減法運算,由函式的第1個引數決定

14 void counting( int (*p)(int, int) , int a, int b)

18 19 int main()

20

如果以後想再增加一種乘法運算,非常簡單,根本不用修改counting函式的**,只需要再增加乙個乘法運算的函式

int mul(int a, int b)
然後counting(mul, 6, 4);就可以進行乘法運算了

指向函式的指標 返回指標的函式

1.函式指標表示指向某一函式的指標,如下所示,int add int,int int pf int,int pf add 注意,因為函式add有兩個引數,所以pf指標也必須有兩個引數 且函式add的兩個引數均為int型,所以pf的兩個引數也必須與之匹配。如下例,include stdio.h inc...

返回指標的函式 指向函式的指標

接下來我只講指標的最常見用法,比如這一章的內容 返回指標的函式 與 指向函式的指標 指標也是c語言中的一種資料型別,因此乙個函式的返回值肯定可以是指標型別的。返回指標的函式的一般形式為 型別名 函式名 引數列表 eg char upper 引數 返回指向char型的指標變數 比如下面這個函式,返回乙...

指向函式的指標 和 返回指標的函式

1 函式指標 char pfun int 定義乙個指向函式的函式指標pfun,指向的函式引數是int型 返回值是char型 char g1fun int a 定義了乙個函式,函式的函式名實際上就是乙個指標函式名指向該函式的 在記憶體中的首位址。int get2 void int get3 void ...