指標函數與函數指標

來源:互聯網
上載者:User

標籤:

返回指標的函數 與 指向函數的指標

 

回到頂部一、返回指標的函數

 指標也是C語言中的一種資料類型,因此一個函數的傳回值肯定可以是指標類型的。

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

 比如下面這個函數,返回一個指向char類型變數的指標

 1 // 將字串str中的小寫字母變成大寫字母,並返回改變後的字串 2 // 注意的是:這裡的參數要傳字串變數,不能傳字串常量 3 char * upper(char *str) { 4 // 先保留最初的地址。因為等會str指向的位置會變來變去的。 5 char *dest = str; 6  7 // 如果還不是Null 字元 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);就可以進行乘法運算了

指標函數與函數指標

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.