【C語言】返回指標的函式與指向函式的指標
一、返回指標的函式
指標也是C語言中的一種資料型別,因此一個函式的返回值肯定可以是指標型別的。
返回指標的函式的一般形式為:型別名 * 函式名(引數列表)
比如下面這個函式,返回一個指向char型別變量的指標
1 // 將字串str中的小寫字母變成大寫字母,並返回改變後的字串 2 // 注意的是:這裡的引數要傳字串變數,不能傳字串常量 3 char * upper(char *str) { 4 // 先保留最初的地址。因為等會str指向的位置會變來變去的。 5 char *dest = str; 6 7 // 如果還不是空字元 8 while (*str != '\0') { 9 // 如果是小寫字母 10 if (*str >= 'a' && *str <= 'z') { 11 // 變為大寫字母。小寫和大寫字母的ASCII值有個固定的差值 12 *str -= 'a' - 'A'; 13 } 14 15 // 遍歷下一個字元 16 str++; 17 } 18 19 // 返回字串 20 return dest; 21 }
裡面的程式碼我就不詳細解釋了,重點看第2行的定
呼叫這個函式也非常簡單:
int main() { // 定義一個字串變數 char str[] = "lmj"; // 呼叫函式 char *dest = upper(str); printf("%s", dest); return 0; }
輸出結果:
回到頂部二、指向函式的指標
看到這個標題,你可能覺得很詫異,指標竟然可以指向一個函式,那我就先解釋一下為什麼指標可以指向一個函式?
1.為什麼指標可以指向一個函式?
函式作為一段程式,在記憶體中也要佔據部分儲存空間,它也有一個起始地址,即函式的入口地址。函式有自己的地址,那就好辦了,我們的指標變數就是用來儲存地址的。因此,可以利用一個指標指向一個函式。其中,函式名就代表著函式的地址
2.指向函式的指標的定義
定義的一般形式:函式的返回值型別 (*指標變數名)(形式引數1, 形式引數2, ...);
注意:形式引數的變數名可以省略,甚至整個形式引數列表都可以省略
1 #include <stdio.h> 2 3 int sum(int a, int b) { 4 return a + b; 5 } 6 7 int main() 8 { 9 // 定義一個指標變數p,指向sum函式 10 int (*p)(int a, int b) = sum; 11 // 或者 int (*p)(int, int) = sum; 12 // 或者 int (*p)() = sum; 13 14 // 利用指標變數p呼叫函式 15 int result = (*p)(1, 3); 16 // 或者 int result = p(1, 3); 17 18 printf("%d", result); 19 return 0; 20 }
* 首先在第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行中的做法,這樣就跟呼叫普通函式沒什麼區別
最後的輸出結果:,毫無意外
3.使用注意
1> 由於這類指標變數儲存的是一個函式的入口地址,所以對它們作加減運算(比如p++)是無意義的。難道p++就會指向下一個函數了?可笑至極!!沒這回事。
2> 返回指標的函式的定義char *upper(char *str) 和 指向函式的指標的定義int (*p)(int a, int b)非常相似,使用時特別注意區分
3> 指向函式的指標變數主要有兩個用途:
-
呼叫函式
-
將函式作為引數在函式間傳遞。我這麼一說,可能還不是很明白,舉個例子。
1 #include <stdio.h> 2 3 // 減法運算 4 int minus(int a, int b) { 5 return a - b; 6 } 7 8 // 加法運算 9 int sum(int a, int b) { 10 return a + b; 11 } 12 13 // 這個counting函式是用來做a和b之間的計算,至於做加法還是減法運算,由函式的第1個引數決定 14 void counting( int (*p)(int, int) , int a, int b) { 15 int result = p(a, b); 16 printf("計算結果為:%d\n", result); 17 } 18 19 int main() 20 { 21 // 進行加法運算 22 counting(sum, 6, 4); 23 24 // 進行減法運算 25 counting(minus, 6, 4); 26 27 return 0; 28 }
如果以後想再增加一種乘法運算,非常簡單,根本不用修改counting函式的程式碼,只需要再增加一個乘法運算的函式
int mul(int a, int b) { return a * b; }
然後counting(mul, 6, 4);就可以進行乘法運算了
轉載出處:http://blog.csdn.net/u012252959/article/details/53606374