博客專欄

        EEPW首頁 > 博客 > Linux C - C基礎篇七(指針高級用法)

        Linux C - C基礎篇七(指針高級用法)

        發布人:嵌入式Linux 時間:2023-01-12 來源:工程師 發布文章
        指針與結構體

        先簡單介紹下結構體

        C語言中結構體(Struct)從本質上講是一種自定義的數據類型,只不過這種數據類型比較復雜,是由 int、char、float 等基本類型組成的。由于結構體將一組相關的變量看作一個整體而不是各自獨立的實體,因此結構體有助于組織復雜的數據,特別是在大型的程序中,結構體非常常見。聲明一個結構體的方式如下:

        struct student {

        char name[16];

        int age;

        int score;

        };

        如下,定義一個結構體變量,并通過"結構體變量名字.成員名字"的方式訪問結構體變量里面的成員:

        struct student stu;

        stu.name = "張三";

        stu.age = 15;

        int a = stu.score;

        結構體指針變量:結構體指針變量是指向結構體的指針,以上面的結構體為例,可以這樣定義如下的結構指針變量:

        struct student *stu1;

        訪問指針變量里面的成員,我們通常使用->,如下:

        stu1->age = 15;

        但是上面的操作是錯誤的,因為stu1是結構體指針變量,并沒有指向某一塊地址,也就是我們所謂的野指針,那么直接訪問它是會導致段錯誤的,正確的做法是給這個指針變量賦值,讓它指向另一個同類型的結構體地址:

        stu1 = &stu; //stu是我們在上面定義的結構體變量,加上&表示取地址

        stu1->age = 15;

        或者通過調用庫函數malloc申請一塊大小為對應結構體大小的內存地址,賦值給結構體指針變量,然后就可以給結構體指針變量所指向的內存地址賦值:

        stu1 = malloc(sizeof(struct strudent));

        stu1->age = 15;

        這種用法在內核代碼中非常常見(Linux內核中使用kmalloc申請內存):

        指針與函數

        指針函數

        指針函數本質是一個函數,只不過它的返回值是一個地址(指針),當我們調用這些函數的時候需要用同類型的指針變量來接收。例如:

        char * strcpy(char *dest, const char *src);

        int *func(int x,int y);

        void *malloc(size_t size);

        int *a = func(3, 5);

        函數指針

        函數指針本質是一個指針變量,只不過它指向的類型是一個函數,那么這個變量只能被一個函數賦值。如下,這種用法在內核中非常常見:

        在結構體中定義函數指針:

        給函數指針賦值:

        總結:

        關于指針的應用在Linux中無論是應用層代碼中還是kernel內核代碼中應用都是非常普遍的,深入的理解指針不經能使自己寫出高效的代碼,更能讓你非常容易的讀懂大型項目中的代碼。


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。

        汽車防盜機相關文章:汽車防盜機原理
        燃氣報警器相關文章:燃氣報警器原理


        關鍵詞: 指針

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 泗水县| 青州市| 遂宁市| 崇信县| 盐源县| 旌德县| 太白县| 华坪县| 介休市| 霸州市| 诸暨市| 历史| 环江| 洪雅县| 嘉善县| 库伦旗| 东城区| 城口县| 英超| 渝中区| 延津县| 山西省| 鹤山市| 明星| 兖州市| 凤山县| 崇信县| 宁晋县| 漳州市| 湖北省| 锦屏县| 金沙县| 永寿县| 克拉玛依市| 漳州市| 咸丰县| 永城市| 穆棱市| 视频| 罗平县| 赣榆县|