前一篇跟你們聊了聊指針的概念,但是就算了解了指針是什麼,爲何依然感受難學?我試着從幾個點切入,聊聊指針難學之處。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語言等級考試上機新版題庫、模擬試卷
3. 程序員面試寶典(第5版)