1. 程式人生 > >【C語言】返回指標的函式與指向函式的指標

【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