最近一年都在用.net和Java,現在需要用C了。昨天看到部落格園首頁的麻省理工開放課程,就找來看看,正好複習一下。這門《C記憶體管理和C++面向對象程式設計》不是那種上來就變量,循環的千篇一律的講法,而是重點講C的核心機制如記憶體管理、指針等,這對于我這種有一定程式設計基礎,但很久沒用C的人比較适合。簡明的plain English,加上生動有趣的描述,看起來即暢快,又令人深受啟發。不得不感慨MIT的水準。下面是我整理的筆記(部分翻譯自課件,部分自己的總結):
原版課件見課程官方首頁:
點選 課程中推薦的C/C++線上學習資料:http://www.cprogramming.com (個人覺得好的英文資料,讀得時候雖然時不時要查查字典,但是比很多中文的都更容易了解,畢竟國外牛人多)1. C語言家族
1) C: Dennis Ritchie于1972年在貝爾實驗室開發出來;是一種指令式語言(imperative system language)
2) C++: Bjarne Stroustrup于1979年在貝爾實驗室開發出來;是一種支援泛型(generics)的指令式,面向對象的語言
3)C#: 2001年,由微軟開發。是一種多範型(multi-paradigm)程式設計語言,支援指令式、函數、泛型、面向對象和記憶體管理。
注:指令式語言又稱強制式語言,通過指明一系列可執行的運算及運算的次序來描述計算過程的語言。平時我們用的大多數語言(比如,C,C+,Java,C#,Python等)都是指令式語言。與它相對的是函數式語言(functional language),如Haskell,Lisp。函數式語言更像數學,指令式語言更接近人的思維。
2. C的典型特征:
1)編譯型語言(compiled language)(相對于解釋型語言來說)
編譯型語言:程式在執行之前需要一個專門的編譯過程,把程式編譯成為機器語言的檔案,運作時不需要重新翻譯,直接運作編譯的結果就行了。是以效率高
解釋型語言:程式不需要編譯,程式在運作時才翻譯成機器語言,每執行一次都要翻譯一次。是以效率比較低
2)指令式的
3) 人工管理記憶體
4)當需要涉及以下問題時使用C:
-速度
-記憶體
-低層次特性(low-level features),如:移動stack pointer等
3. 記憶體抽象的層次(從記憶體的角度思考C...)
抽象層次 程式設計語言
--------------------------------------
直接操作記憶體 彙編語言
通路記憶體 C,C++
記憶體自動管理 Java,C#,Scheme/LISP,ML
4. C通路的記憶體:堆(heap)
堆是一塊兒用于動态記憶體配置設定的記憶體區域
1)把它想像稱為一個巨大的數組
2)通過指針(pointer)來通路
3)整個程式都能通路堆(如果作業系統允許的話)
5. 人工記憶體管理
目的:
1) 允許程式能夠配置設定記憶體用于目前的使用
2)當程式執行完後,能夠釋放記憶體,用于重新配置設定
C語言的标準類庫(standard library)中有malloc和free兩個函數支援記憶體管理
6. 其它C通路的記憶體:棧(stack)
C語言中棧是編譯器自動配置設定和回收,用于存放函數及其參數,局部變量等的記憶體區域
C函數将會配置設定到棧中:
1)函數在被調用時進棧(pushed on to stack)
2) 函數在傳回時出棧(popefd off the stack)
3) 函數能通路目前棧頂部以下的所有記憶體(這裡所謂的“頂部以下”如下圖所示)
![]()
麻省理工《C記憶體管理和C++面向對象程式設計》筆記---第一講:認識C和記憶體管理 7.一些基本的C文法如變量,循環,分支等跳過。
8. 編譯器。推薦使用GCC,一般是在linux下用gcc+gedit寫C程式。
9. 調試工具:gdb和valgrind。
gdb文檔: http://www.gnu.org/software/gdb/
valgrind文檔:http://valgrind.org/
10. 課後作業1及源碼:
課件主要是提供思路和引導,課後作業才是鍛煉的最好途徑。