色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【C語言進階】C語言指針的高階用法

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

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

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

  • C語言的指針是什么?
  • C語言指針的高級應用:函數指針
  • 函數指針的具體應用示例

C語言的指針是什么


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

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

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


C語言指針的高級應用:函數指針


? 【函數指針】,顧名思義,就是一個指向函數的指針,它的本質還是一個指針,只不過這個指針指向的內容是一個函數。

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

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

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

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

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

typedef int (*FUNCTION)(int arg);

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

? 從定義上看,因為()擁有最高優先級,所以*FUNCTION首先結合在一起,這就決定了它是一個指針。接著,*FUNCTION的后面接上了(int arg),這就是函數的入參;而前面的int 就表示函數的返回值。這就是【函數指針】的原型定義。

? 【函數指針】最為一種特殊的指針,自然它也是要指向內容才能使用的,毫無疑問,它就是要指向對應原型的函數。具體怎么使用呢?


函數指針的具體應用示例


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

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

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;        //定義個函數指針

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

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

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

    return 0;
}

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

    //終極大招,循環處理3個函數的間接調用
    for (i = 0; i < sizeof(func_array); i ++) {
        func = func_array[i]; //把函數指針指向對應的函數
        ret = func(arg);      //通過函數指針間接調用對應的函數
    }

    return 0;
}

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

    /*
    結果輸出,兩個function_pointer_test函數均有同樣的輸出結果:
    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;
}

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

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

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


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

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


延伸閱讀預告:

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

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

    關注

    180

    文章

    7604

    瀏覽量

    136692
  • 指針
    +關注

    關注

    1

    文章

    480

    瀏覽量

    70551
  • 函數指針
    +關注

    關注

    2

    文章

    56

    瀏覽量

    3778
收藏 人收藏

    評論

    相關推薦

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

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

    C語言指針的高級用法

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

    C語言入門教程-指針

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

    C語言指針電子教程

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

    C語言中指針的介紹非常詳細

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

    C語言指針函數和函數指針詳細介紹

    C語言指針函數和函數指針詳細介紹。。。。。。。
    發表于 03-04 15:27 ?5次下載

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

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

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

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

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

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

    C語言進階】sprintf和snprintf的區別

    C語言進階】sprintf 和 snprintf 真的沒有區別嗎?
    的頭像 發表于 08-31 13:18 ?1.2w次閱讀

    C語言進階】“數組指針”和“指針數組”都是啥跟啥?

    C語言進階】“數組指針”和“指針數組”都是啥跟啥?
    的頭像 發表于 08-31 13:21 ?1912次閱讀

    C語言進階】利用assert高效排查你的C程序

    C語言進階】利用assert高效排查你的C程序
    的頭像 發表于 08-31 13:27 ?2109次閱讀

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

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

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

    指針C語言中一個比較重要的東西,有人說指針C語言的靈魂這句話說的一點也沒錯。 正確靈活地運用
    發表于 09-21 12:32 ?1097次閱讀
    <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>變量做函數參數

    C語言指針用法

    C語言編程中善用指針可以簡化一些任務的處理,而對于一些任務(比如動態內存分配),必須要有指針才行的。也就是說精通C
    發表于 03-05 14:22 ?346次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>指針</b><b class='flag-5'>用法</b>
    主站蜘蛛池模板: 孕交videosgratis乌克兰| 2018高清国产一区二区三区| 99热只有精品| 巨乳中文无码亚洲| 忘忧草高清| 国产a级黄色毛片| 日本湿姝在线观看| 97成人在线视频| 久久水蜜桃亚洲AV无码精品偷窥| 亚洲欧洲一级| 精品一区二区三区免费观看| 亚洲精品在线影院| 加勒比一本之道高清视频在线观看| 我把寡妇日出水好爽| 国产精品人妻无码久久久蜜桃| 玩弄放荡人妻一区二区三区| 大学生宿舍飞机china free| 日韩hd高清xxxⅹ| 国产精品亚洲污污网站入口| 亚洲国产欧美日韩在线一区| 国内精品日本久久久久影院| 伊人久久大香线蕉观看| 免费特黄一区二区三区视频一| 最新国产亚洲亚洲精品视频| 欧美牲交视频免费观看K8经典| 东热rq大乱交| 亚洲精品久久一区二区三区四区| 久见久热 这里只有精品| 99久久99久久久精品齐齐鬼色| 全彩acg无翼乌火影忍者| 国产精品久久久久成人免费| 亚洲无线码一区在线观看| 妹妹的第一次有点紧| 草柳最新地址| 亚洲女人毛片| 起碰免费公开97在线视频| 国产精品一区二区免费| 做暧暧免费30秒体验| 日韩精品久久久久影院| 娇小亚裔被两个黑人| YELLOW视频直播在线观看|