在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【C語言進(jìn)階】C語言指針的高階用法

嵌入式物聯(lián)網(wǎng)開發(fā) ? 來源:嵌入式物聯(lián)網(wǎng)開發(fā) ? 作者:嵌入式物聯(lián)網(wǎng)開發(fā) ? 2022-08-31 13:24 ? 次閱讀
相信大家當(dāng)初學(xué)習(xí)C語言的時候,老師一定跟你說過這樣的一句大實話:【**指針,是C語言的靈魂**】。

? 筆者自出來工作以來,幾乎天天都要跟C語言打交道,回過頭來想一想,這話確實沒有錯。

? 本文,打算從一個另類的角度,介紹下C語言指針的高級用法,通過本文的閱讀,你將了解到以下知識:

  • C語言的指針是什么?
  • C語言指針的高級應(yīng)用:函數(shù)指針
  • 函數(shù)指針的具體應(yīng)用示例

C語言的指針是什么


? 指針是什么?相信所有的C語言教程,都會告訴你:【指針就是地址】。沒錯,的確是這么回事。C語言的指針就好比房屋的地址,只要有了地址,我們就可以訪問到全世界的每一個角落。C語言的世界也是如此,地址就是一切,有了地址,就沒有干不成的事情。

? 在C語言里,如果想對一個int類型的變量a進(jìn)行賦值操作,我們會這樣寫: a = 5;這樣的形式,就是直接訪問。對應(yīng)的,我們有間接訪問的方式,就是通過指針來實現(xiàn)。比如我們可以定義一個指針 int *b = &a; 指針b存放的是a變量的地址,我們通過這樣: *b = 5;一樣可以實現(xiàn)對a進(jìn)行賦值操作,這就是間接訪問的力量。

? C語言的指針是靈活的,它不僅可以像如上代碼一樣,指向一個普通變量,它也可以指向一個結(jié)構(gòu)體變量,甚至還可以指向一個函數(shù)名。原因就在于,函數(shù)名,在C語言的語法里,本質(zhì)上就代表了函數(shù)的執(zhí)行地址,說白了,它也是一個“指針”。而這,就是我們以下要詳細(xì)介紹的【函數(shù)指針】。


C語言指針的高級應(yīng)用:函數(shù)指針


? 【函數(shù)指針】,顧名思義,就是一個指向函數(shù)的指針,它的本質(zhì)還是一個指針,只不過這個指針指向的內(nèi)容是一個函數(shù)。

? 在講解【函數(shù)指針】之前,我們先假設(shè)有若干個函數(shù),它們的原型定義如下所示:

int test_function_1(int arg);
int test_function_2(int arg);
int test_function_3(int arg);
...
int test_function_n(int arg);

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NgxkHoX2-1661923373249)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

? 從函數(shù)原型上我們可以知道,這些個函數(shù)都是接收一個int類型的形參,返回值類型為int型。從原型上看,這幾個函數(shù)幾乎是一模一樣,那么我們有沒有方法可以將這些原型一致的函數(shù)重新整理定義呢?答案肯定是,有的。

? 追求高效、簡潔的C語言就我們提供了一個非常有用的關(guān)鍵字typedef,通過typedef我們可以重新創(chuàng)造出一個新的數(shù)據(jù)類型,而不再局限于C語言的基本數(shù)據(jù)類型。比如我們就可以利用typedef定義一個叫形如上述函數(shù)原型的【函數(shù)指針】數(shù)據(jù)類型,它的寫法如下所示:

typedef int (*FUNCTION)(int arg);

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MLEkQ9Bo-1661923373252)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

? 從定義上看,因為()擁有最高優(yōu)先級,所以*FUNCTION首先結(jié)合在一起,這就決定了它是一個指針。接著,*FUNCTION的后面接上了(int arg),這就是函數(shù)的入?yún)ⅲ欢懊娴膇nt 就表示函數(shù)的返回值。這就是【函數(shù)指針】的原型定義。

? 【函數(shù)指針】最為一種特殊的指針,自然它也是要指向內(nèi)容才能使用的,毫無疑問,它就是要指向?qū)?yīng)原型的函數(shù)。具體怎么使用呢?


函數(shù)指針的具體應(yīng)用示例


? 【函數(shù)指針】這種高階用法,可能有些人用得比較少,但是如果你閱讀過類似openssl這樣的大型C語言編寫的開源代碼之后,相信你一定會感嘆:原來,C語言的指針還能這么用!!!

? 有了【函數(shù)指針】的利器,我們就可以用它來大做文章,請看以下示例代碼:

int test_function_1(int arg)
{
    printf("This msg is printed form %s ...\n", __func__);
    return arg;
}

int test_function_2(int arg)
{
    printf("This msg is printed form %s ...\n", __func__);
    return arg;
}

int test_function_3(int arg)
{
    printf("This msg is printed form %s ...\n", __func__);
    return arg;
}

typedef int (*FUNCTION)(int arg);

int function_pointer_test_1(void)
{
    int ret;
    int arg = 1;
    FUNCTION func = NULL;        //定義個函數(shù)指針

    func = test_function_1;     //把函數(shù)指針指向test-function-1
    //ret = test_function_1(arg); //通過函數(shù)名直接調(diào)用test-function-1函數(shù)
    ret = func(arg);            //通過函數(shù)指針間接調(diào)用test-function-1函數(shù)

    func = test_function_2;     //把函數(shù)指針指向test-function-2
    //ret = test_function_2(arg); //通過函數(shù)名直接調(diào)用test-function-2函數(shù)
    ret = func(arg);            //通過函數(shù)指針間接調(diào)用test-function-2函數(shù)

    func = test_function_3;     //把函數(shù)指針指向test-function-3
    //ret = test_function_3(arg); //通過函數(shù)名直接調(diào)用test-function-3函數(shù)
    ret = func(arg);            //通過函數(shù)指針間接調(diào)用test-function-3函數(shù)

    return 0;
}

int function_pointer_test_2(void)
{
    int ret;
    int arg = 1;
    int i = 0;
    FUNCTION func = NULL;       //定義個函數(shù)指針
    FUNCTION func_array[] =     //定義一組函數(shù)列表
    {
        test_function_1,
        test_function_2,
        test_function_3,
    };

    //終極大招,循環(huán)處理3個函數(shù)的間接調(diào)用
    for (i = 0; i < sizeof(func_array); i ++) {
        func = func_array[i]; //把函數(shù)指針指向?qū)?yīng)的函數(shù)
        ret = func(arg);      //通過函數(shù)指針間接調(diào)用對應(yīng)的函數(shù)
    }

    return 0;
}

int main(int argc, char **argv)
{
    function_pointer_test_1();
    function_pointer_test_2();  

    /*
    結(jié)果輸出,兩個function_pointer_test函數(shù)均有同樣的輸出結(jié)果:
    This msg is printed form test_function_1 ...
    This msg is printed form test_function_2 ...
    This msg is printed form test_function_3 ...
    */

    return 0;
}

/*
總結(jié):
雖然通過兩個調(diào)用的方式,輸出結(jié)果是一致的,但是顯然方式2的處理更為高效、簡潔;
從代碼的字里行間,仿佛看到C語言的“多態(tài)”:將不同的函數(shù)名賦值給同一個函數(shù)指針變量;
使用同一個函數(shù)指針發(fā)起函數(shù)調(diào)用,得到不一樣的結(jié)果輸出,這不就是多態(tài)嗎?
*/

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oLznHZnb-1661923373260)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

? 通過如上的示例代碼,C語言的【多態(tài)】你get到了嗎?


? 千萬不要小瞧了上面的示例代碼,如果你能熟練掌握其中的【指針精髓】,再去閱讀一些業(yè)內(nèi)廣泛使用的C語言編寫的開源項目源碼,比如大名鼎鼎的openssl;相信閱讀之后,你的C語言功力一定會大大地提升。

? 不過,值得注意的是,文中的示例代碼均是筆者在編程環(huán)境下編寫,屬于【白板編程】,難免會出現(xiàn)編寫錯誤、編譯不過、或執(zhí)行結(jié)果不正確的情況;還請細(xì)心的讀者誠心指正,感激不盡。


延伸閱讀預(yù)告:

為充實C語言的指針知識,筆者將會在后續(xù)的文章中整理大名鼎鼎的C語言巨著《C和指針》,敬請期待。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7630

    瀏覽量

    140733
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    484

    瀏覽量

    71073
  • 函數(shù)指針
    +關(guān)注

    關(guān)注

    2

    文章

    57

    瀏覽量

    3950
收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    C語言中指針的基本概念和用法

    C語言中,指針是一項重要的概念,它允許我們直接訪問和操作內(nèi)存地址。
    發(fā)表于 08-17 15:30 ?1162次閱讀

    C語言指針的高級用法

    C語言指針搞不好說實話實在是太麻煩的一個東西,而且C語言指針還是繞不過的一個坎,所以我覺得還是苦
    發(fā)表于 11-06 16:50

    C語言入門教程-指針

    指針C語言中,指針被廣泛使用。所以要想完整地掌握C語言,您需要對
    發(fā)表于 07-29 11:30 ?722次閱讀

    C語言指針電子教程

    本資料是一份不錯的關(guān)于C語言指針的電子教程,希望對大家有所幫助... 指針簡介 指針C
    發(fā)表于 07-30 16:00 ?77次下載

    C語言中指針的介紹非常詳細(xì)

    C語言中指針的介紹非常詳細(xì) C語言中指針的介紹非常詳細(xì)
    發(fā)表于 12-25 10:39 ?57次下載

    C語言指針函數(shù)和函數(shù)指針詳細(xì)介紹

    C語言指針函數(shù)和函數(shù)指針詳細(xì)介紹。。。。。。。
    發(fā)表于 03-04 15:27 ?5次下載

    C語言的精髓——指針詳解

    C語言的精髓——指針詳解
    發(fā)表于 11-30 14:43 ?17次下載

    基于C語言中指針的基本用法解析

    C語言中其它的知識都學(xué)得可以,唯獨指針搞不懂。如果是這樣,我可以很負(fù)責(zé)的告訴你,對于這門編程語言,你等于是沒學(xué)。所以學(xué)好指針對于初學(xué)者是非
    的頭像 發(fā)表于 01-09 15:12 ?4982次閱讀

    C語言-一維指針定義與使用

    指針在很多書本上都是當(dāng)做重點來介紹,作為C語言的靈魂,項目里指針無處不在。 這篇文章介紹指針的基本用法
    的頭像 發(fā)表于 08-14 10:02 ?1595次閱讀

    C語言進(jìn)階】sprintf和snprintf的區(qū)別

    C語言進(jìn)階】sprintf 和 snprintf 真的沒有區(qū)別嗎?
    的頭像 發(fā)表于 08-31 13:18 ?1.3w次閱讀

    C語言進(jìn)階】“數(shù)組指針”和“指針數(shù)組”都是啥跟啥?

    C語言進(jìn)階】“數(shù)組指針”和“指針數(shù)組”都是啥跟啥?
    的頭像 發(fā)表于 08-31 13:21 ?2176次閱讀

    C語言進(jìn)階】利用assert高效排查你的C程序

    C語言進(jìn)階】利用assert高效排查你的C程序
    的頭像 發(fā)表于 08-31 13:27 ?2513次閱讀

    詳解C語言指針底層基本原理

    說到指針,估計還是有很多小伙伴都還是云里霧里的,有點“知其然,而不知其所以然”。但是,不得不說,學(xué)了指針C語言才能算是入門了。指針
    的頭像 發(fā)表于 04-06 10:43 ?1685次閱讀

    c語言指針用法詳解:如何使用指針變量做函數(shù)參數(shù)

    指針C語言中一個比較重要的東西,有人說指針C語言的靈魂這句話說的一點也沒錯。 正確靈活地運用
    發(fā)表于 09-21 12:32 ?1468次閱讀
    <b class='flag-5'>c</b><b class='flag-5'>語言</b><b class='flag-5'>指針</b><b class='flag-5'>用法</b>詳解:如何使用<b class='flag-5'>指針</b>變量做函數(shù)參數(shù)

    C語言指針用法

    C語言編程中善用指針可以簡化一些任務(wù)的處理,而對于一些任務(wù)(比如動態(tài)內(nèi)存分配),必須要有指針才行的。也就是說精通C
    發(fā)表于 03-05 14:22 ?612次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>指針</b><b class='flag-5'>用法</b>
    主站蜘蛛池模板: 狠狠干天天干 | 四虎影院观看视频在线观看 | 美女骚网站 | 色天天综合 | 色射啪 | 黄色一级片毛片 | 奇米激情 | 性欧美日韩 | 日本成片免费高清 | 激情婷婷六月天 | 国产亚洲一区二区三区啪 | 欧美性满足hd1819 | 午夜性爽视频男人的天堂在线 | 国产伦精品一区二区三区在线观看 | 在线视频亚洲一区 | 乱人伦的小说 | 在线观看永久免费视频网站 | 天天夜夜操 | 免费福利午夜影视网 | 夜恋秀场欧美成人影院 | 国产美女视频黄a视频全免费网站 | 国产免费午夜高清 | 黄视频国产 | 国产成人无精品久久久久国语 | 四虎精品影院在线观看视频 | 国产精品视频你懂的 | 夜夜天天干 | 日本三级吹潮 | h视频免费观看 | www.天天干 | 深夜视频在线 | 狠狠曹| 傲视影院午夜毛片 | cijilu刺激 国产免费的 | 5月色婷婷| 久久精品网站免费观看 | 色天天综合网 | 午夜影院0606免费 | 激情综合视频 | 午夜精品久久久久久久 | 日本欧洲亚洲一区在线观看 |