Linux C - C基礎篇七(指針高級用法)
先簡單介紹下結構體
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內核代碼中應用都是非常普遍的,深入的理解指針不經能使自己寫出高效的代碼,更能讓你非常容易的讀懂大型項目中的代碼。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。
汽車防盜機相關文章:汽車防盜機原理 燃氣報警器相關文章:燃氣報警器原理