C語言 返回指標的函式與指向函式的指標

2021-07-25 08:33:27 字數 1920 閱讀 4221



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

返回指標的函式的一般形式為:型別名 * 函式名(引數列表)

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

1

//將字串str中的小寫字母變成大寫字母,並返回改變後的字串2//

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

3char * upper(char *str)

1415

//遍歷下乙個字元

16 str++;17}

1819

//返回字串

20return

dest;

21 }

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

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

int

main()

輸出結果:

回到頂部

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

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

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

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

1 #include 2

3int sum(int a, int

b) 6

7int

main()

8

* 首先在第3行定義了乙個sum函式,接收2個int型別的引數,返回值型別為int

* 然後在第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行中的做法,這樣就跟呼叫普通函式沒什麼區別

最後的輸出結果:

1> 由於這類指標變數儲存的是乙個函式的入口位址,所以對它們作加減運算(比如p++)是無意義的。難道p++就會指向下乙個函式了?可笑至極!!沒這回事。

2> 返回指標的函式的定義char

*upper(char

*str) 和 指向函式的指標的定義int

(*p)(int

a, int

b)非常相似,使用時特別注意區分

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

1 #include 23//

減法運算

4int minus(int a, int

b) 78//

加法運算

9int sum(int a, int

b) 12

13//

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

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

b) 18

19int

main()

20

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

int mul(int a, int

b)

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

C語言 返回指標的函式與指向函式的指標

本文目錄 說明 這個c語言專題,是學習ios開發的前奏。也為了讓有物件導向語言開發經驗的程式設計師,能夠快速上手c語言。如果你還沒有程式設計經驗,或者對c語言 ios開發不感興趣,請忽略 回到頂部 前面我們花了接近3個章節學習指標,應該都感受到指標的強大了吧。指標可以根據位址直接操作記憶體中的資料,...

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

每乙個函式在計算機內部都有儲存單元,通過記憶體可以反問到這個函式,指標可以指向記憶體中的某乙個位置,可以用指標指向函式的初始位置。一般定義形式 資料型別 指標 參數列 資料型別指的是函式返回的資料型別,右側是參數列,指標指向函式的引數型別。注意與返回指標的函式之間的區別 int p int 是乙個指...

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

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