C語言指針專題——指針難學的4點緣由

前一篇跟你們聊了聊指針的概念,但是就算了解了指針是什麼,爲何依然感受難學?我試着從幾個點切入,聊聊指針難學之處。node

文末會給你們推薦幾本書,有須要的朋友能夠看看!程序員

難點1. 討厭的星號面試

定義指針變量p時,都會加個*號。在用到指針變量p時,也會加個*號。好比如下代碼:數據結構

int main()
{
    int *p;
    p = malloc(sizeof(int));
    *p = 1;
    
    return 0;
}

程序定義了一個指針變量p,前面有個*號;後面給指針p指向的內存區域賦值1,又有個*號,這兩個*號有啥區別呢?不少初學者在這裏會搞不懂。spa

定義指針p時,前面的*號只是告訴編譯器,p是個指針,其它沒什麼用處。我我的一直認爲,當初發明C語言時,定義指針p時不該該用*來講明,你能夠用@號,用#號,用$號,隨便用什麼號來講明p是個指針,這樣就不會與下面用到指針p時的*混淆了。操作系統

*p = 1這個語句的*號,起到的做用就是跨過指針p本身的值,直搗黃龍,取得指針p指向的存儲區域。關於指針p本身的值,和指針p指向的值,能夠參考我以前的文章。指針

因此*號出如今不一樣的位置,有不一樣的做用,這是剛開始學指針時難學的一個地方。code

難點2. 分不清址與值blog

這裏的址就是地址,就是不少教材喜歡說的指針變量是個地址,地址,地址。。。。地你妹啊,誰看得懂什麼地址地址地址的!而值,就是指針p指向的數據。ip

還借用上面的代碼,跟指針p相關的數據就兩個,一個是指針p本身的值,程序中是明顯看不到的,是程序運行時操做系統才能看到的,指針p本身的值就是教材中提到不少次的「地址」;另外一個就是指針p指向的值,程序中就是常量「1」。

本文原創,發表於知乎專欄,歡迎轉發!

我認爲不少教材只會講地址,地址,地址,根本就沒有講清這個「址」與「值」這二者的區別,誰搞得懂。

難點3. 藉助址來讀值

指針有本身的值的概念,有指向的值的概念,二者的關係也是讓初學者迷糊的。指針要藉助本身的值,去找到指向的值,也就是藉助址來讀取值。

就像上面的代碼片斷,假設指針p本身的值是0x12345678,這就是一個內存區域的地址,藉助這個址,再結合星號,就能夠將整數1放在0x12345678這塊內存中了。此時,指針p藉助本身的值(0x12345678)指向了一個值(1)。

呵呵,借址讀(寫)值,已經讓人暈了。

難點4. 鏈表結點

若是上述3點還不算變態的話,那麼結合鏈表這種數據結構,那就至關的變態了。

好比鏈表的結點每每定義爲一個結構體,就像這樣:

struct node

{

    int i;

    struct node *next;

}

而後會有什麼創建鏈表啊,插入鏈表啊,刪除鏈表啊,哪個操做不會用到指針next?

原本鏈表操做就讓人煩了,再加上指針這個東東,真是煩上加煩。

可不是嘛,好比定義了一個結點變量指針p,以下

struct node *p;

而後你就會看到滿程序都有p->next,說不定還有其它的結點變量指針q,再來個p->next = q->next,或者q->next = p->next,讓人眼花繚亂,能不煩不。

本文先提這4點指針難點,也許還有其它的難點,本文也不贅述了。無論怎樣,指針雖難,可是隻要理解其本質,那麼理解指針,或者理解一段包含指針的代碼,或者寫一段含有指針的代碼,只是時間問題。

好書推薦:

1. 2017.9.全國計算機C語言等級考試上機新版題庫、模擬試卷

2. C Primer Plus 第6版 中文版

3. 程序員面試寶典(第5版)

相關文章
相關標籤/搜索