欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

十四、返回指針的函數與指向函數的指針

系統 2220 0

十四、返回指針的函數與指向函數的指針 - M了個J - 博客園

十四、返回指針的函數與指向函數的指針

說明: 這個C語言專題,是學習iOS開發的前奏。也為了讓有面向對象語言開發經驗的程序員,能夠快速上手C語言。如果你還沒有編程經驗,或者對C語言、iOS開發不感興趣,請忽略

前言

前面我們花了接近3個章節學習指針,應該都感受到指針的強大了吧。指針可以根據地址直接操作內存中的數據,使用得當的話,不僅能使代碼量變少,還能優化內存管理、提升程序性能。關于指針的內容還非常多,比如指針數組、指向數組的指針、指向指針的指針,呵呵,看到這些名字是否都覺得頭大了,不過我就暫時不在博客中講解這些內容了,我只講述在iOS開發中指針的最常見用法,比如這一章的內容---- 返回指針的函數 指向函數的指針

?

一、返回指針的函數

? 指針也是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);就可以進 行乘法運算了

十四、返回指針的函數與指向函數的指針


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本一区二区三区免费观看 | 波多野结衣办公室在线 | 亚洲人网站 | 国内精品久久久久久99蜜桃 | 波多野结衣在线看片 | 欧美一区免费 | 免费又粗又硬进去好爽A片视频 | 日韩在线观看精品 | 亚洲精品国产偷自在线观看 | 日韩欧美高清 | 色网站在线免费观看 | a毛片视频网站 | 久草香蕉 | 久久91精品 | 精品久久一二三区 | 精品综合| 94在线成人免费视频 | 欧美日韩色综合网站 | 欧美笫一页 | 色婷婷天天综合在线 | 天天操夜夜做 | 色婷婷精品 | 天天操你 | 国产精品亚洲精品不卡 | 精品久久久久久久久久久久久久久 | 国产一区二区三区不卡在线观看 | 激情婷婷六月天 | 精品乱子伦一区二区三区 | 国产福利不卡视频在免费播放 | 成人精品一区 | 国产精品一区av | 日本黄色片一级片 | 九九福利影院 | 精品视频一区二区 | 日韩视频一区二区三区 | 亚洲国产成人av好男人在线观看 | 综合色区 | 好吊日在线视频 | 亚洲一区二区久久 | 国产精品一码二码三码在线 | 国产91精品黄网在线观看 |