亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

十四、返回指針的函數(shù)與指向函數(shù)的指針

系統(tǒng) 2556 0

十四、返回指針的函數(shù)與指向函數(shù)的指針 - M了個(gè)J - 博客園

十四、返回指針的函數(shù)與指向函數(shù)的指針

說(shuō)明: 這個(gè)C語(yǔ)言專題,是學(xué)習(xí)iOS開(kāi)發(fā)的前奏。也為了讓有面向?qū)ο笳Z(yǔ)言開(kāi)發(fā)經(jīng)驗(yàn)的程序員,能夠快速上手C語(yǔ)言。如果你還沒(méi)有編程經(jīng)驗(yàn),或者對(duì)C語(yǔ)言、iOS開(kāi)發(fā)不感興趣,請(qǐng)忽略

前言

前面我們花了接近3個(gè)章節(jié)學(xué)習(xí)指針,應(yīng)該都感受到指針的強(qiáng)大了吧。指針可以根據(jù)地址直接操作內(nèi)存中的數(shù)據(jù),使用得當(dāng)?shù)脑挘粌H能使代碼量變少,還能優(yōu)化內(nèi)存管理、提升程序性能。關(guān)于指針的內(nèi)容還非常多,比如指針數(shù)組、指向數(shù)組的指針、指向指針的指針,呵呵,看到這些名字是否都覺(jué)得頭大了,不過(guò)我就暫時(shí)不在博客中講解這些內(nèi)容了,我只講述在iOS開(kāi)發(fā)中指針的最常見(jiàn)用法,比如這一章的內(nèi)容---- 返回指針的函數(shù) 指向函數(shù)的指針

?

一、返回指針的函數(shù)

? 指針也是C語(yǔ)言中的一種數(shù)據(jù)類型,因此一個(gè)函數(shù)的返回值肯定可以是指針類型的。

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

?比如下面這個(gè)函數(shù),返回一個(gè) 指向char類型變 量的指針

            
               1
            
            
              //
            
            
               將字符串str中的小寫(xiě)字母變成大寫(xiě)字母,并返回改變后的字符串

            
            
               2
            
            
              //
            
            
               注意的是:這里的參數(shù)要傳字符串變量,不能傳字符串常量
            
            
               3
            
            
              char
            
             * upper(
            
              char
            
             *
            
              str) {

            
            
               4
            
            
              //
            
            
               先保留最初的地址。因?yàn)榈葧?huì)str指向的位置會(huì)變來(lái)變?nèi)サ摹?
            
            
               5
            
            
              char
            
             *dest =
            
               str;

            
            
               6
            
            
               7
            
            
              //
            
            
               如果還不是空字符
            
            
               8
            
            
              while
            
             (*str != 
            
              '
            
            
              \0
            
            
              '
            
            
              ) {

            
            
               9
            
            
              //
            
            
               如果是小寫(xiě)字母
            
            
              10
            
            
              if
            
             (*str >= 
            
              '
            
            
              a
            
            
              '
            
             && *str <= 
            
              '
            
            
              z
            
            
              '
            
            
              ) {

            
            
              11
            
            
              //
            
            
               變?yōu)榇髮?xiě)字母。小寫(xiě)和大寫(xiě)字母的ASCII值有個(gè)固定的差值
            
            
              12
            
                         *str -= 
            
              '
            
            
              a
            
            
              '
            
             - 
            
              '
            
            
              A
            
            
              '
            
            
              ;

            
            
              13
            
            
                      }

            
            
              14
            
            
              15
            
            
              //
            
            
               遍歷下一個(gè)字符
            
            
              16
            
                     str++
            
              ;

            
            
              17
            
            
                  }

            
            
              18
            
            
              19
            
            
              //
            
            
               返回字符串
            
            
              20
            
            
              return
            
            
               dest;

            
            
              21
            
             }
          

里面的代碼我就不詳細(xì)解釋了,重 點(diǎn)看第2行的定 義形式。

調(diào)用這個(gè)函數(shù)也非常簡(jiǎn)單:

            
              int
            
            
               main()
{
    
            
            
              //
            
            
               定義一個(gè)字符串變量
            
            
              char
            
             str[] = 
            
              "
            
            
              lmj
            
            
              "
            
            
              ;
    
    
            
            
              //
            
            
               調(diào)用函數(shù)
            
            
              char
            
             *dest =
            
               upper(str);
    
    printf(
            
            
              "
            
            
              %s
            
            
              "
            
            
              , dest);
    
            
            
              return
            
            
              0
            
            
              ;
}
            
          

輸出結(jié)果:

?

二、指向函數(shù)的指針

看到這個(gè)標(biāo)題,你可能覺(jué)得很詫異,指針竟然可以指向一個(gè)函數(shù),那我就先解釋一下 為什么指針可以指向一個(gè)函數(shù)

1. 為什么指針可以指向一個(gè)函數(shù)

函數(shù)作為一段程序,在內(nèi)存中也要占據(jù)部分存儲(chǔ)空間,它也有一個(gè)起始地址,即函數(shù)的入口地址。函數(shù)有自己的地址,那就好辦了,我們的指針變量就是用來(lái)存儲(chǔ)地址的。因此,可以利用一個(gè)指針指向一個(gè)函數(shù)。其中, 函數(shù)名就代表著函數(shù)的地址

?

2.指向函數(shù)的指針的定義

定義的一般形式: 函數(shù)的返回值類型 (*指針變量名)(形式參數(shù)1, 形式參數(shù)2, ...);

注意: 形式參數(shù)的變量名可以省略,甚至整個(gè)形式參數(shù)列表都可以省略

            
               1
            
             #include <stdio.h>

            
               2
            
            
               3
            
            
              int
            
             sum(
            
              int
            
             a, 
            
              int
            
            
               b) {

            
            
               4
            
            
              return
            
             a +
            
               b;

            
            
               5
            
            
              }

            
            
               6
            
            
               7
            
            
              int
            
            
               main()

            
            
               8
            
            
              {

            
            
               9
            
            
              //
            
            
               定義一個(gè)指針變量p,指向sum函數(shù)
            
            
              10
            
            
              int
            
             (*p)(
            
              int
            
             a, 
            
              int
            
             b) =
            
               sum;

            
            
              11
            
            
              //
            
            
               或者 int (*p)(int, int) = sum;

            
            
              12
            
            
              //
            
            
               或者 int (*p)() = sum;

            
            
              13
            
            
              14
            
            
              //
            
            
               利用指針變量p調(diào)用函數(shù)
            
            
              15
            
            
              int
            
             result = (*p)(
            
              1
            
            , 
            
              3
            
            
              );

            
            
              16
            
            
              //
            
            
               或者 int result = p(1, 3);
            
            
              17
            
            
              18
            
                 printf(
            
              "
            
            
              %d
            
            
              "
            
            
              , result);

            
            
              19
            
            
              return
            
            
              0
            
            
              ;

            
            
              20
            
             }
          

* 先在第3行定義了一個(gè)sum函數(shù),接收2個(gè)int類型的參數(shù),返回值類型為int

* 然后在第10行定義了一個(gè) 指向sum函數(shù) 的指針變量p。注意p的定義形式: int (*p)( int a, int b),第1個(gè) int 代表sum函數(shù)的返回值是 int 類型,然后*p是用括號(hào)()包住的,后面的 int a和 int b代表著sum函數(shù)的形參,其實(shí)完全可以省略。第10行、11行、12行都是可行

* 在第15行,先利用*p取出指向的函數(shù),再傳入?yún)?shù)調(diào)用函數(shù)。也可以采用第16行中的做法,這樣就跟調(diào)用普通函數(shù)沒(méi)什么區(qū)別

最后的輸出結(jié)果: ,毫無(wú)意外

?

3.使用注意

1> 由于這類指針變量存儲(chǔ)的是一個(gè)函數(shù)的入口地址,所以對(duì)它們作加減運(yùn) 算(比如p++) 是無(wú)意義的 。難道p++就會(huì)指向下一個(gè)函數(shù)了?可笑至極!!沒(méi)這回事。

2> 返回指針的函數(shù)的定 char *upper( char *str) 和 指向函數(shù)的指針的定義 int (*p)( int a,? int b)非常相似,使用時(shí)特 別注意區(qū)分

3> 指向函數(shù)的指針變量主要有兩個(gè)用途:

  • 調(diào)用函數(shù)

  • 將函數(shù)作為參數(shù)在函數(shù)間傳遞。我這么一說(shuō),可能還不是很明白,舉個(gè)例子。

            
               1
            
             #include <stdio.h>

            
               2
            
            
               3
            
            
              //
            
            
               減法運(yùn)算
            
            
               4
            
            
              int
            
             minus(
            
              int
            
             a, 
            
              int
            
            
               b) {

            
            
               5
            
            
              return
            
             a -
            
               b;

            
            
               6
            
            
              }

            
            
               7
            
            
               8
            
            
              //
            
            
               加法運(yùn)算
            
            
               9
            
            
              int
            
             sum(
            
              int
            
             a, 
            
              int
            
            
               b) {

            
            
              10
            
            
              return
            
             a +
            
               b;

            
            
              11
            
            
              }

            
            
              12
            
            
              13
            
            
              //
            
            
               這個(gè)counting函數(shù)是用來(lái)做a和b之間的計(jì)算,至于做加法還是減法運(yùn)算,由函數(shù)的第1個(gè)參數(shù)決定
            
            
              14
            
            
              void
            
             counting( 
            
              int
            
             (*p)(
            
              int
            
            , 
            
              int
            
            ) , 
            
              int
            
             a, 
            
              int
            
            
               b) {

            
            
              15
            
            
              int
            
             result =
            
               p(a, b);

            
            
              16
            
                 printf(
            
              "
            
            
              計(jì)算結(jié)果為:%d\n
            
            
              "
            
            
              , result);

            
            
              17
            
            
              }

            
            
              18
            
            
              19
            
            
              int
            
            
               main()

            
            
              20
            
            
              {

            
            
              21
            
            
              //
            
            
               進(jìn)行加法運(yùn)算
            
            
              22
            
                 counting(sum, 
            
              6
            
            , 
            
              4
            
            
              );

            
            
              23
            
            
              24
            
            
              //
            
            
               進(jìn)行減法運(yùn)算
            
            
              25
            
                 counting(minus, 
            
              6
            
            , 
            
              4
            
            
              );

            
            
              26
            
            
              27
            
            
              return
            
            
              0
            
            
              ;

            
            
              28
            
             }
          

如果以后想再增加一種乘法運(yùn)算, 非常簡(jiǎn)單,根本不用修改counting函數(shù)的代碼,只需要再增加一個(gè)乘法運(yùn)算 的函數(shù)

            
              int
            
             mul(
            
              int
            
             a, 
            
              int
            
            
               b) {
    
            
            
              return
            
             a *
            
               b;
}
            
          

后counting(mul, 6, 4);就可以進(jìn) 行乘法運(yùn)算了

十四、返回指針的函數(shù)與指向函數(shù)的指針


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 久久久久久久久66精品片 | 97精品国产高清在线看入口 | 欲色综合 | 国产在线观看一区二区三区四区 | 激情宗合网 | 久草青青| 香蕉在线观看999 | 99久久精品国产一区二区成人 | 伊人涩涩 | 激情小视频在线播放免费 | 久久久久欧美精品观看 | 狠狠色噜噜狠狠米奇777 | 欧美.成人.综合在线 | 深夜免费视频 | 99日精品欧美国产 | 亚洲国产精品久久卡一 | 九色视频极品论坛区 | 国内外成人在线视频 | 深夜福利在线免费观看 | 99视频免费观看 | 欧美天天| 在线成人a毛片免费播放 | 91精品国产综合久久精品 | 色综合久久综精品 | 日本中文字幕网站 | 俄罗斯毛片免费大全 | 成人精品一区久久久久 | 免费观看四虎精品国产永久 | 久久永久免费 | 欧美一区2区三区3区公司 | 操熟美女又肥又嫩的骚屁股 | 日本人69视频jizz免费看 | 精品国产第一国产综合精品gif | 久久视频免费 | 一区二区精品久久 | 久久久久久久久亚洲 | 99久久国产亚洲综合精品 | 综合中文字幕 | 成人牲交一极毛片 | 免费毛片大全 | 鲁一鲁中文字幕久久 |