C/C++復仇(下)

 

看好書

自從上次寫了《C/C++復仇記(下)》以來,我繼續看《C語言深度剖析》,理解了幾個以前不懂的知識點,例如指針數組,數組指針,函數指針(平時歷來不用)等。java

 

我甚至以爲C語言是一門很難的語言,以前認爲容易,是由於只接觸了容易的部分,固然這是相對而言的(python,java等高級語言都沒有指針啥的,並且內存管理也輕鬆不少)。可是C做爲咱們大學裏面學習的第一門語言,也是面試,筆試,考試,競賽等等最經常使用到的語言,沒有理由很差好學習之。而學習它,更多的是語言實現細節,不只僅是語法細節,而實現細節在語言上的反映就是編譯器的作法,好比函數,好比一個malloc函數,理解了它的實現,就能夠知道爲何申請後要進行轉化成特定類型的指針(由於用到了void*指針類型)等等,這些都須要深刻理解,甚至是動手調試。python

C的指針和數組

指針與數組的區別面試

書裏面講的很明白,數組和指針是徹底不一樣的東西,相互之間也沒有什麼關聯。只是它們的某些操做方法很類似,因此經常令咱們迷惑。指針是一個地址,指向的是內存中的一塊內存,它的類型只是表示它怎麼解讀內存裏面的內容。如int *p = &a[0]; 使得p指向數組的首元素的首地址,而後*(p+1)則表示下一個int型,是跨越了4個字節的(32位機)。固然也能夠用下標的方式來訪問: p[1],其等價於 *(p+1),這就是迷惑咱們的地方,由於數組也能夠這樣來訪問。數組

 

幾個要說明的問題

對指針進行加 1 操做,獲得的是下一個元素的地址,而不是直接下一個字節的地址。ide

假設有 int a[10] = {0};函數

數組名a做爲右值:學習

int (*p)[10] = &a;   // 將整個數組的首地址賦予數組指針, +1解讀爲跳10個int類型大小。指針是按照類型來肯定下一個元素的位置的。spa

當 int *p = &a;     // 編譯器將會警告,說類型轉換,把數組地址賦給了int* p指針

當a做爲右值時,和&a[0]是同樣的。也就是說能夠這樣用:調試

int x = *(a+1);      // 表示數組的第二個元素賦值給x

 

區別指針數組和數組的指針:

A),int *p1[10];        // 指針數組 int* p1[10]  ,[]的優先級比*高。

B),int (*p2)[10];        // 數組指針 int (*)[10]  p2, 指向10個元素數組的一個指針

 

 

理解指針和數組,最重要的是理解,指針是一個地址,指向一片內存,怎麼解讀內存關鍵在於起始地址和指針類型。而數組則是做爲一個總體存在的,能夠訪問數組內的單個元素,可是其自己能夠做爲一種類型,能夠有指向這種類型的指針。

一種意識

學習一種語言,到了必定的程度,應該養成了察覺錯誤的意識。錯過一次後,找到犯錯誤的緣由,也就不會錯了。而每每咱們犯錯誤,是由於咱們的認知沒有到位,沒有搞清各個元素之間的關係。咱們學習同樣技能,老是克服原有的思惟方法,從新肯定其表達方式,歸根結底都是一種映射,可是這種映射和咱們潛意識中的內容可能有誤差,而閱讀更多的知識,作更多的練習是減小這種誤差的惟一方法。加油!

END

by bibodeng 2013-04-20 16:44:12

相關文章
相關標籤/搜索