Linux C - C基礎(chǔ)篇七(指針高級用法)
先簡單介紹下結(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ù)本質(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>