Linux C - C基礎篇七(指針高級用法)
先簡(jiǎn)單介紹下結構體
C語(yǔ)言中結構體(Struct)從本質(zhì)上講是一種自定義的數據類(lèi)型,只不過(guò)這種數據類(lèi)型比較復雜,是由 int、char、float 等基本類(lèi)型組成的。由于結構體將一組相關(guān)的變量看作一個(gè)整體而不是各自獨立的實(shí)體,因此結構體有助于組織復雜的數據,特別是在大型的程序中,結構體非常常見(jiàn)。聲明一個(gè)結構體的方式如下:
struct student {
char name[16];
int age;
int score;
};
如下,定義一個(gè)結構體變量,并通過(guò)"結構體變量名字.成員名字"的方式訪(fǎng)問(wèn)結構體變量里面的成員:
struct student stu;
stu.name = "張三";
stu.age = 15;
int a = stu.score;
結構體指針變量:結構體指針變量是指向結構體的指針,以上面的結構體為例,可以這樣定義如下的結構指針變量:
struct student *stu1;
訪(fǎng)問(wèn)指針變量里面的成員,我們通常使用->,如下:
stu1->age = 15;
但是上面的操作是錯誤的,因為stu1是結構體指針變量,并沒(méi)有指向某一塊地址,也就是我們所謂的野指針,那么直接訪(fǎng)問(wèn)它是會(huì )導致段錯誤的,正確的做法是給這個(gè)指針變量賦值,讓它指向另一個(gè)同類(lèi)型的結構體地址:
stu1 = &stu; //stu是我們在上面定義的結構體變量,加上&表示取地址
stu1->age = 15;
或者通過(guò)調用庫函數malloc申請一塊大小為對應結構體大小的內存地址,賦值給結構體指針變量,然后就可以給結構體指針變量所指向的內存地址賦值:
stu1 = malloc(sizeof(struct strudent));
stu1->age = 15;
這種用法在內核代碼中非常常見(jiàn)(Linux內核中使用kmalloc申請內存):
指針函數
指針函數本質(zhì)是一個(gè)函數,只不過(guò)它的返回值是一個(gè)地址(指針),當我們調用這些函數的時(shí)候需要用同類(lèi)型的指針變量來(lái)接收。例如:
char * strcpy(char *dest, const char *src);
int *func(int x,int y);
void *malloc(size_t size);
int *a = func(3, 5);
函數指針
函數指針本質(zhì)是一個(gè)指針變量,只不過(guò)它指向的類(lèi)型是一個(gè)函數,那么這個(gè)變量只能被一個(gè)函數賦值。如下,這種用法在內核中非常常見(jiàn):
在結構體中定義函數指針:
給函數指針賦值:
關(guān)于指針的應用在Linux中無(wú)論是應用層代碼中還是kernel內核代碼中應用都是非常普遍的,深入的理解指針不經(jīng)能使自己寫(xiě)出高效的代碼,更能讓你非常容易的讀懂大型項目中的代碼。
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。
汽車(chē)防盜機相關(guān)文章:汽車(chē)防盜機原理 燃氣報警器相關(guān)文章:燃氣報警器原理