《征服C指標》讀書筆記

來源:互聯網
上載者:User

本文同時發布在我的個人部落格上,歡迎訪問~ www.seekingdream.cn

在讀完K&R之後,對C的認識就是指標、數組。網上的人們對指標也有些“敬而遠之”的感覺。最近從同學處淘得《征服C指標》一書,首先映入眼簾的是封面的“毒舌程式員”這個稱號。用這個周末的時間,把這本書讀了一下,最大的感受確實是“毒舌”。下面細細談談自己的幾點感受吧!

1、看到這本書的時候,想到的是西遊記。本書的作者就是西遊記中的“孫悟空”,縱使其有百般武藝,卻始終擺脫不了“如來”的五指山。哪誰是“如來”呢?自然是K&R.作者是在博人眼球呢,還是在借K&R來提高自己的名氣呢?畢竟中國有句古話“看一個人有多優秀,要看他的對手是誰”。本書中作者處處指出K&R中的“錯誤點”,並且死死揪住這些點死死不放,不過也是,誰讓K&R當時不嚴謹呢?

2、個人感覺本書有點“虎頭蛇尾”。在讀完該書的前面2章的時候,帶著一種崇敬的眼光來看,畢竟“原書暢銷11年”,所以自己的收穫也是比較大的。最讓我感到高深的就是文中的第二章“C是怎麼使用記憶體的”,作者確實是講的比較深入。不過從第三章開始,作者在一直不斷的重複C中的聲明,並且一直在糾結於一些很細的文法點。從中可以看出作者確實是功力深厚,可是這是不是給人一種在賣弄的感覺呢?到本書的第四章,主要講了“數組和指標的常用方法”,應該來說在應用方面還是不錯的。至於第五章,鑒於網上對該章的評價不高,又由於自己本次的目的是深入瞭解指標,所以就直接跳過了。第六章則講述了指標方面的一些陷阱和慣用用法。

以上是自己讀過本書的一點感受。

下面是讀該書時的筆記:

1、先有了指標類型,因為有了指標類型,所以有了指標類型的變數和指標類型的值。2、在C語言標準中,關於main()函數的使用只有如下兩種方式:     int main(int argc,char *argv[])或者int main(void)     儘管如此,在一些書中會出現void main(void)這樣的寫法,這是錯誤的。有些編譯器會通過,但是也有一些會出現錯誤。3、對指標加減運算,標準只允許指標指向數組內的元素,或者超過數組長度的下一個元素。4、在C語言中對指標加1,地址的值會增加當前指標所指向資料類型的長度。5、當常量0處於應該作為指標使用的上下文中時,他就作為空白指標使用。6、如果試圖將數組作為函數參數進行傳遞,那就傳遞指向初始元素的指標。7、無論如何都要將數組進行值傳遞的時候,建議將數組整體整理成結構體成員。8、在下面聲明的形參,都具有相同的意義         int func(int *a) = int func(int a[]) = int func(int a[10])

第二章:1、在如今的運行環境中,應用程式面對的是虛擬位址空間2‘、關於scanf:scanf()不是以行單位對輸入內容進行解釋,而是對連續字元流進行解釋(換行字元也視為一個字元)。如果使用語句scanf("%d",&tmp),scanf連續地從流讀入字元,並且對和格式說明符(%d)相匹配的部分進行變換處理。如果輸入的不是整數,則出錯。並且出錯的字元會依舊殘留在流中。如果想使用以下語句:while(scanf("%d",&hoge) !=-1) {    /*操作*/}   則可以使用fgets()和sscanf()組合來代替,就可以避免上面提到的問題。(ps:關於fgets的文章可以參考下,不錯。http://blog.csdn.net/jackin2/article/details/5573771)3、c語言中通過malloc()動態分配的記憶體地區,壽命到調用free()為止。4、在c中,正如數組在運算式中可以被解讀成指標一樣,”函數“也同時意味著”指向函數的指標“。通常,這個指標指向函數的初始地址5、自動變數的地址是在運行時被決定的,它屬於連結器管轄範圍以外的對象。自動變數重複使用記憶體地區。因此,自動變數的地址是不一定的。在C語言中,通常將自動變數儲存在棧中。通過將自動變數分配在棧中,記憶體地區可以被重複利用,這樣可以節約記憶體。6、C語言的參數是從後往前被堆積在棧中的。這樣做是為了實現可變長參數這個功能。重要的是無論需要堆積多少參數,總能找到第一個參數的地址。7、malloc可以動態地(運行時)進行記憶體配置,並且可以通過任意的順序釋放。malloc分配的地區是堆,而不是棧。8、定義可變數組: char *arr;arr = malloc(sizeof(char)*len);9、C語言預設地將沒有聲明的函數的傳回值解釋成int類型,那些運氣好的程式,如果被遷移到int和指標長度不同的處理環境中,就會突然跑不起來。10、在C中不需要對malloc()的傳回值進行強制類型轉換,但是在C++中則必須要進行強制類型轉換。因為C++可以將任意的指標賦給void*類型的變數,但不可以將void*類型的值賦給通常的指標變數。11、malloc()大體的實現是從作業系統一次性地取得比較大的記憶體,然後將這些記憶體”零售“給應用程式。12、free()之後,如果此時還有其他地址使用這部分記憶體,則記憶體不會立馬釋放。13、無論是整數還是浮點小數,記憶體上的表現形式都隨著環境的不同而不同。14、在C語言編程過程中,一旦出現bug,請帶著”指標就是地址“的觀點去解決它--這種姿態在解決bug上是恰到好處的。 15、解讀C聲明(1)複雜C聲明的解讀:http://ashin.sinaapp.com/article/54/16、C中,數組是不能作為參數傳遞的。只能傳遞指向數組初始元素的指標。17、const修飾的是緊跟在它後面的單詞。18、對於函數的形參,最外層的數組會被解讀成指標,即使定義了元素個數,也會被無視。19、應該記住:數組和指標是不同的事物。一些常見的指標和數組的錯誤使用:(1)int *p; p[3]  此時的錯誤是:突然使用沒有指向記憶體地區的指標。自動變數的指標在初期狀態,值是不定的(2)char str[10];...str =“abc”;  此處的錯誤是:突然向數組賦值。數組既不是標量,也不是結構體,不能臨時使用(3)int p[];此處的錯誤是使用空的[ ]聲明局部變數。只有“在函數的聲明中”,數組的聲明才被解讀成指標。20、在運算式中,數組可以被解讀成指向其初始元素的指標。      只有在聲明函數的形參的時候,數組的聲明才能解讀成指標的聲明。
第四章21、如果需要通過函數傳回值以外的方式傳回值,將“指向T的指標”(如果想要返回的值得類型為T)作為參數傳遞給函數。22、想要將類型T的數組作為參數進行傳遞,可以考慮傳遞“指向T的指標”。可是,作為被呼叫者是不知道數組的元素個數的,所以在必要的情況下,需要使用其他方式進行參數傳遞。23、在需要擷取類型T的可變長數組時,可以使用malloc()來動態地給“指向T的指標”分配記憶體地區。但此時需要程式員自己對數組的元素個數進行管理。24、指標可以指到數組的最後元素的下一個元素。第六章25、如果使用strncpy(),請注意它可能產生沒有Null 字元結尾的字串。

備忘:for(i = 0;i<LoopMax;i++){          /*array[i] 會出現多次*/     }    for(p=&array[0];p!=&array[Loopmax];p++){          /* 在這兒*p 進行各種各樣的處理。*p會出現多次*/    }K&R的TCPL中曾經描述了“一般情況下,使用指標的程式比使用數組要高效”,但是自己並不知道原因,現在《征服C指標》中有這方面的描述:array[i]相當於*(array+i)的加法運算,如果再一個for迴圈裡面,則執行多次array的加法運算,此時必然效率低。如果用指標,則加法運算只有在迴圈結束的時候執行一次。這完全是"K&R時代的錯誤“,現在的編譯器幾乎沒有差別。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.