博客專欄

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

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

發(fā)布人:嵌入式Linux 時間:2023-01-12 來源:工程師 發(fā)布文章
指針與結(jié)構(gòu)體

先簡單介紹下結(jié)構(gòu)體

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

struct student {

char name[16];

int age;

int score;

};

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

struct student stu;

stu.name = "張三";

stu.age = 15;

int a = stu.score;

結(jié)構(gòu)體指針變量:結(jié)構(gòu)體指針變量是指向結(jié)構(gòu)體的指針,以上面的結(jié)構(gòu)體為例,可以這樣定義如下的結(jié)構(gòu)指針變量:

struct student *stu1;

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

stu1->age = 15;

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

stu1 = &stu; //stu是我們在上面定義的結(jié)構(gòu)體變量,加上&表示取地址

stu1->age = 15;

或者通過調(diào)用庫函數(shù)malloc申請一塊大小為對應(yīng)結(jié)構(gòu)體大小的內(nèi)存地址,賦值給結(jié)構(gòu)體指針變量,然后就可以給結(jié)構(gòu)體指針變量所指向的內(nèi)存地址賦值:

stu1 = malloc(sizeof(struct strudent));

stu1->age = 15;

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

指針與函數(shù)

指針函數(shù)

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

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

int *func(int x,int y);

void *malloc(size_t size);

int *a = func(3, 5);

函數(shù)指針

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

在結(jié)構(gòu)體中定義函數(shù)指針:

給函數(shù)指針賦值:

總結(jié):

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


*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。

汽車防盜機相關(guān)文章:汽車防盜機原理
燃?xì)鈭缶飨嚓P(guān)文章:燃?xì)鈭缶髟?/a>



相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉