指標也是c語言中的一種資料型別,因此乙個函式的返回值肯定可以是指標型別的。
返回指標的函式的一般形式為:型別名 * 函式名(引數列表)
比如下面這個函式,返回乙個指向char型別變數的指標
1裡面的**我就不詳細解釋了,重點看第2行的定義形式。//將字串str中的小寫字母變成大寫字母,並返回改變後的字串2//
注意的是:這裡的引數要傳字串變數,不能傳字串常量
3char * upper(char *str)
1415
//遍歷下乙個字元
16 str++;17}
1819
//返回字串
20return
dest;
21 }
呼叫這個函式也非常簡單:
int輸出結果:main()
回到頂部
看到這個標題,你可能覺得很詫異,指標竟然可以指向乙個函式,那我就先解釋一下為什麼指標可以指向乙個函式?
函式作為一段程式,在記憶體中也要佔據部分儲存空間,它也有乙個起始位址,即函式的入口位址。函式有自己的位址,那就好辦了,我們的指標變數就是用來儲存位址的。因此,可以利用乙個指標指向乙個函式。其中,函式名就代表著函式的位址。
定義的一般形式:函式的返回值型別 (*指標變數名)(形式引數1, 形式引數2, ...);
注意:形式引數的變數名可以省略,甚至整個形式引數列表都可以省略
1 #include 2* 首先在第3行定義了乙個sum函式,接收2個int型別的引數,返回值型別為int3int sum(int a, int
b) 6
7int
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行中的做法,這樣就跟呼叫普通函式沒什麼區別
最後的輸出結果:
1> 由於這類指標變數儲存的是乙個函式的入口位址,所以對它們作加減運算(比如p++)是無意義的。難道p++就會指向下乙個函式了?可笑至極!!沒這回事。
2> 返回指標的函式的定義char
*upper(char
*str) 和 指向函式的指標的定義int
(*p)(int
a, int
b)非常相似,使用時特別注意區分
3> 指向函式的指標變數主要有兩個用途:
1 #include 23//如果以後想再增加一種乘法運算,非常簡單,根本不用修改counting函式的**,只需要再增加乙個乘法運算的函式減法運算
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
int mul(int a, int然後counting(mul, 6, 4);就可以進行乘法運算了b)
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...