一站式學習C編程

一站式學習C編程

《一站式學習C編程》是2011年4月電子工業出版社出版的圖書,作者是宋勁杉。

基本介紹

  • 書名:一站式學習C編程
  • 作者:宋勁杉 
  • ISBN:978-7-121-12982-7 
  • 頁數:472 頁
  • 定價: 59.00元
  • 出版社電子工業出版社
  • 出版時間:2011年4月
  • 開本:16開
內容簡介,宣傳語,編輯推薦,前 言,致謝,目 錄,

內容簡介

本書有兩條線索,一條線索是以Linux平台為載體全面深入地介紹C語言的語法和程式的工作原理,另一條線索是介紹程式設計的基本思想和開發調試方法。本書分為兩部分:第一部分講解程式語言和程式設計的基本思想方法,讓讀者從概念上認識C語言;第二部分結合作業系統和體系結構的知識講解程式的工作原理,讓讀者從本質上認識C語言。

宣傳語

暢銷書升級版
手把手教你將四年的任務用四個月做好
以C語言為載體,系統講述計算機原理和程式原理
從零基礎開始學習編程,內容涵蓋C語言入門及C語言本質

編輯推薦

本書適合做零基礎的初學者學習C語言的第一本教材,幫助讀者打下牢固的基礎。有一定的編程經驗但知識體系不夠完整的讀者也可以對照本書查缺補漏,從而更深入地理解程式的工作原理。本書最初是為北京亞嵌教育研究中心的嵌入式Linux系統工程師就業班課程量身定做的教材之一,也適合作為高等院校程式設計基礎課程的教材。本書對於C語言的語法介紹得非常全面,對C99標準做了很多解讀,因此也可以作為一本精簡的C語言語法參 考書。

前 言

本書最初是為北京亞嵌教育研究中心的嵌入式Linux系統工程師就業班課程量身定做的教材之一。該課程是為期四個月的全日制職業培訓,要求學員畢業時具備非常Solid的C編程能力,能熟練地使用Linux系統,同時對計算機體系結構與指令集、作業系統原理和設備驅動程式都有較深入的了解。然而學員入學時的水平是非常初級而且參差不齊的:學歷有專科、本科也有研究生,專業有和計算機相關的也有很不相關的(例如會計專業),以前從事的職業有和技術相關的也有完全不相關的(例如HR),年齡從二十出頭到三十五六歲的都有。這么多背景完全不同、基礎完全不同、思維習慣和理解能力完全不同的人來聽同一堂課,大家都迫切希望學會嵌入式開發技術,投身IT行業,這就是職業教育的特點,也是我寫作本書時需要考慮的主要問題。
學習編程絕不是一件簡單的事,尤其是對於零基礎的初學者來說。大學的計算機專業有四年時間從零基礎開始培養一個人,微積分、線性代數、隨機數學、離散數學、組合數學、自動機、編譯原理、作業系統、計算機組成原理等一堆基礎課,再加上C/C++、Java、資料庫、網路、軟體工程、計算機圖形學等一堆專業課,最後培養出一個能找到工作的學生。很遺憾這最後一條很多學校沒有做好,來亞嵌培訓的很多學生這四年就是這么學過來的,但據我們考查他們的基礎幾乎為零,我不知道為什麼。與之形成鮮明對比的是,只給我們四個月的時間,同樣要求從零基礎開始,最後培養出一個能找到工作的學生,而且還要保證他找到工作,這就是職業教育的特點。
為什麼我說“只給我們四個月的時間”?我們倒是想教四年呢,但學時的長短我們做不了主,是由市場規律決定的。四年的任務要求四個月做好,要怎么完成這樣一個幾乎不可能的任務呢?有些職業教育給出的答案是“實用主義”,打出了“有用就學,沒有用就不學”的口號,大肆貶低說大學裡教的基礎課都是過時的、無用的,只有他們教的技術才是實用的,這種炒作很不好,我認為大學裡教的每一門課都是非常有用的,基礎知識在任何時候都不會過時,倒是那些時髦的“實用技術”有可能很快就過時了。
四年的任務怎么才能用四個月做好?我們給出的答案是“最佳化”。現在大學裡安排的課程體系最大的缺點就是根本不考慮最佳化。每個過來人都會有這樣的感覺:大一大二學了好多數學課,卻不知道都是乾什麼用的,也不懂為什麼要學。連它有什麼用都不知道怎么能有興趣學好呢?然後到大三大四學專業課時,用到以前的知識了,才發現以前學的數學是多么有用,然而早就忘得一乾二淨了,考完試都還給老師了,回頭重新學吧,這時候發現很多東西以前根本沒學明白,現在才真的學明白了,那么前兩年的時間豈不是都浪費了?大學裡的課程體系還有一個缺點就是不靈活,每門課必須占一個學期,必須由一個老師教,不同課程的老師之間沒有任何溝通和銜接,其實這些課程之間是相互依賴的,把它們強行拆開是不符合人的認知規律的。比如我剛上大學的時候,大一上半學期就被逼著學C語言,其實C語言是一門很難的程式語言,不懂編譯原理、作業系統和計算機體系結構根本不可能學明白,那半個學期自然就浪費掉了。當時幾乎所有學校的計算機相關專業都是這樣,大一上來就學C語言,有的學校更瘋狂,上來就學C++,導致大多數學生都以為自己會C語言,但其實都是半吊子水平,到真正寫代碼的時候經常為一個Bug搞得焦頭爛額,卻沒有機會再系統地學一遍C語言,因為在學校看來,C語言課早在大一就給你“上完了”,就像一頓飯已經吃完了,不管你吃飽沒吃飽,不會再讓你重吃一遍了。顯而易見,如果要認真地對這些課程做最佳化,的確是有很多水分可以擠的。
本書有什麼特點
本書不是孤立地講C語言,而是和編譯原理、作業系統、計算機體系結構結合起來講。或者說,本書的內容只是以C語言為載體,真正講的是計算機的原理和程式的原理。
強調基本概念和基本原理,在編排順序上非常重視概念之間的依賴關係,每次引入一個新的概念,只依賴於前面章節已經講過的概念,而絕不會依賴後面章節要講的概念。有些地方為了敘述得完整,也會引用後面要講的內容,比如說“有關我們到第章再仔細講解”,凡是這種引用都不是必要的依賴,可以當它不存在,只管繼續往下看就行了。
儘量做到每個知識點直到要用的時候才引入。過早引入一個知識點,講完了又不用它,讀者很快就會遺忘,這是不符合認知規律的。
本書面向什麼樣的讀者
這是一本從零基礎開始學習編程的書,不要求讀者有任何編程經驗,但讀者至少需要具備以下素質:
熟悉Linux系統的基本操作。如果不具備這一點,請先參考其他教材學習Linux系統的基本操作,熟練之後再學習本書,《鳥哥的Linux私房菜》據說是Linux系統管理和套用方面比較好的一本書。但學習本書並不需要會很多系統管理技術,只要會用基本命令,會自己安裝系統和軟體包就足夠了。
具有高中畢業的數學水平。本書會用到高中的數學知識。事實上,如果不具有高中畢業的數學水平,也不必考慮做程式設計師了。但並不是說只要具有高中畢業的數學水平就足夠做程式設計師了,只能說看這本書應該沒有問題,數學是程式設計師最重要的修養,計算機科學其實就是數學的一個分支,如果你的數學功底很差,日後還需惡補一下。
具有高中畢業的英文水平。理由同上。
對計算機的原理和本質深感興趣,不是為就業而學習,不是為拿高薪而學習,而是真的感興趣,想把一切來龍去脈搞得清清楚楚而學習。
我認為程式設計師有三種境界①[1]1:第一種是把編程當做謀生手段的程式設計師,這種人學點技術找到工作就覺得修成正果了,上班時能偷懶則偷懶,一聽說加班就怨聲載道,下班後絕不碰跟工作相關的東西;第二種是希望通過編程不斷提高自己生活品質的程式設計師,這種人向來認為寫代碼和看書學習是自己的事,是為提高自己的競爭力而做的,只不過順便幫老闆創造了價值,所以加班什麼的從來不計較,不僅積極完成工作,而且每時每刻都在想如何把工作完成得更漂亮;最高境界的是把編程當做畢生愛好的程式設計師,這種人通常也具備第二種人的品質,此外還有一些獨特之處,無論是工作中用到的技術還是與工作無關的技術都同樣有興趣鑽研,無論是有報酬的工作還是無報酬的開源軟體都同樣積極參與,甚至退休之後仍把編程當做消遣,換句話說,編程就是一種生活方式。我自己大概屬於第二種人吧。如果你不幸屬於第一種人,那么你不適合做程式設計師,請放棄學習本書。
勤于思考。本書盡最大努力理清概念之間的依賴關係,力求一站式學習,讀者不需要為了找一個概念的定義去翻其他書,也不需要為了搞清楚一個概念在本書中前後一通亂翻,只需從前到後按順序學習即可。但一站式學習並不等於傻瓜式學習,有些章節有一定的難度,需要積極思考才能領會。本書可以替你節省時間,但不能替你思考,不要指望像看小說一樣走馬觀花看一遍就能學會。
為什麼要學這本書而不是K&R
K&R是公認的世界上最經典的C語言教程,這點毫無疑問。在C標準出台之前,K&R第一版就是事實上的C標準。C89標準出台之後,K&R跟著標準推出了第二版,可惜此後就沒有更新過了,所以不能反映C89之後C語言的發展以及最新的C99標準,本書在這方面做了很多補充。上面我說過了,這本書與其說是講C語言,不如說是以C語言為載體講計算機和作業系統的原理,而K&R只是為了講C語言而講C語言,側重點不同,內容編排也很不相同。K&R寫得非常好,代碼和語言都非常簡潔,但很可惜,只有會C語言的人才懂得欣賞它,K&R是非常不適合入門學習的,尤其不適合零基礎的學生入門學習。
本書“是什麼”和“不是什麼”
本書包括兩大部分:
C語言入門。介紹基本的C語法,幫助沒有任何編程經驗的讀者理解什麼是程式,怎么寫程式,培養程式設計師的思維習慣,找到編程的感覺。其中前6章改編自參考文獻[1]。
C語言本質。結合計算機和作業系統的原理講解C程式是怎么編譯、連結、運行的,同時全面介紹C的語法。第 15.1 節改編自林小竹老師的講義,第 25.1 節和第 25.2 節改編自朱仲濤老師的講義,第 17 章改編自參考文獻[2]。
這本書定位在入門級,雖然內容很多,但不是一本百科全書,除了把C語言基本講透了之外其他內容都不深入,書中列出了很多參考文獻,是讀者進一步學習的起點。K&R的第1章是一個Whirlwind Tour,把全書的內容簡單過一遍,然後再逐個深入講解。本書也可以看作是計算機專業課程體系的一個Whirlwind Tour,學完之後讀者有了一個全局觀,再去學習本書所列的參考文獻就應該很容易上手了。
有的評論者批評我這本書是“滿漢全席(暗含的意思就是這一本就行了)”,什麼都想講,什麼都講不細,不符合UNIX的哲學(Do one thing, do it well),我必須要反駁一下了。構想有一個菜鳥,對學習計算機技術非常有熱情,卻不知從何處入手,於是去請教一個牛人,這個牛人就是批評我的那個評論者,以他的風格一定會給這個菜鳥推薦一個書單子(或許和本書的參考書目差不多吧),然後對菜鳥說:Study each book, study it well.如果這個菜鳥來請教我,我會首先推薦他看這本書,然後對他說:看完這本書只是一個開始,以後的路還長著呢,但我相信你看完這本書就知道以後該看什麼書,而不需要再問別人了。
為什麼要在Linux平台上學C語言?
用Windows學C語言不好嗎?
用Windows還真的是學不好C語言。C語言是一種面向底層的程式語言,要寫好C程式,必須對作業系統的工作原理非常清楚,因為作業系統也是用C寫的,我們用C寫應用程式直接使用作業系統提供的接口。Linux是一種開源的作業系統,你有任何疑問都可以從原始碼和文檔中找到答案,即使你看不懂原始碼也找不到文檔,也很容易找個高手教你,各種郵件列表、新聞組和論壇上從來都不缺樂於助人的高手;而Windows是一種封閉的作業系統,除了微軟的員工別人都看不到它的原始碼,只能通過文檔去猜測它的工作原理,更糟糕的是,微軟向來喜歡藏著掖著,好用的功能留著自己用,而不會寫到文檔里公開。
Windows平台上的開發工具往往和各種集成開發環境(Integrated Development Environment,IDE)綁在一起,例如Visual Studio、Eclipse等。使用IDE確實很便捷,但IDE對於初學者絕對不是好東西。微軟喜歡宣揚傻瓜式編程的理念,告訴你用滑鼠拖幾個控制項然後單擊一個按鈕就可以編譯出程式來,但是真正有用的程式有哪個是這么拖出來的?很多從Windows平台入門學編程的人,編了好幾年程式,還是只知道編完程式單擊一個按鈕就可以跑了,把幾個源檔案拖到一個項目里就可以編譯到一起了,如果有更複雜的需求他們就傻眼了,因為他們腦子裡只有按鈕、選單的概念,根本沒有編譯器、連結器、Makefile的概念,甚至連命令行都沒用過,然而這些都是初學編程就應該建立起來的基本概念。另一方面,編譯器、連結器和C語言的語法有密切的關係,不了解編譯器、連結器的工作原理就不可能真正掌握C的語法。所以,IDE並沒有幫助你學習,反而阻礙了你學習,本來要學好C編程只要把語法和編譯命令學會就行了,現在有了IDE,除了學會語法和編譯命令,你還得弄清楚編譯命令和IDE是怎么集成的,這才算學明白了,本來就很複雜的學習任務被IDE搞得更加複雜了。Linux用戶的使用習慣從來都是以敲命令為主,以滑鼠操作為輔,從學編程的第一天起就要敲命令編譯程式,等到你把這些基本概念都搞清楚了,你覺得哪個IDE好用你再去用,不過到那時候你可能會更喜歡vi或emacs而不是IDE了。
有的讀者目前只會用Windows系統,
但想學習C編程,能否從本書學起?
為了照顧只會用Windows系統的讀者,我也會介紹Windows下的C開發環境,本書絕大多數程式只使用標準C的語法和庫函式,在Windows上也可以編譯運行,但是有關調試、作業系統原理和連結原理的章節則完全以Linux系統為背景來講解,Windows平台上的連結和調試相關知識可以參考電子工業出版社出版的《軟體調試》和《程式設計師的自我修養——連結、裝載與庫》。總之,除了第 10 章、第 17 章、第 18 章、第 19 章、第 21 章之外,本書其他章節都可以在Windows平台上學習。
本書是《Linux C編程一站式學習》的升級版,
它和前一版有什麼不同?
自《Linux C編程一站式學習》出版以來,我收到了很多讀者反饋,讓我意識到很多地方寫得還不到位,所以決定修訂和再版。我認為寫一本書應該是一個持續改進的過程,一旦停筆,這本書也就失去了生命力。所以這次修訂也不會是最終版本,只要還有不十分滿意的地方,日後我還會繼續修訂下去。
本書相對於前一版的改動僅限於局部細節,已經買過前一版的讀者朋友可以不必購買本書。很多讀者期望本書網路版中的Linux系統編程部分也能修訂出版,很遺憾的是目前我還沒有精力修訂那一部分。下一步計畫可能會把Linux系統編程部分單獨成書出版,但請不要抱有期望,寫書畢竟不是我生活的主線,只是業餘的、興趣驅動的和半公益性質的活動,請讀者朋友們諒解。
本書相對於前一版的改進主要有以下幾方面。
本書是一本C語言教材而不是Linux教材,事實上絕大部分章節是平台無關的,上一版過於強調Linux平台,使很多Windows平台的初學者錯過了本書。我已經知錯了,特將書名中的Linux字眼去掉,並且在書中補充介紹了Windows下的C開發環境。
本書是一本C語言教材而不是嵌入式開發教材,一些培訓公司的市場宣傳給很多初學者植入了錯誤的觀念,比如“只有嵌入式開發才用C語言,做別的開發不需要學C語言”。本書的上一版很不幸地歸類在“嵌入式技術叢書”里,為避免強化嵌入式和C語言之間的錯誤關聯,也為了避免讀者誤以為本書是培訓公司用剪刀漿糊拼湊出來的Yet another嵌入式教材,本書不再歸類於“嵌入式技術叢書”。
雖然我在上一版中信誓旦旦地說這是一本面向完全零基礎讀者的書,但現實教育了我,要寫出一本讓任何零基礎讀者都看得懂的書是一門複雜的系統工程,我只能努力接近這個目標,而永遠達不到這個目標。感謝我老婆桃子和我表弟大鵬,他們作為真正的零基礎讀者仔細Review了我的書,尤其桃子還是一個文科生,她每次給我指出的問題都完全出乎我的意料
——原來還有人會這么理解啊,原來還有人用這樣的思維方式啊。經過一番修訂之後,現在我還是要說這是一本面向完全零基礎讀者的書,至少我一直是朝這個目標努力的。
修正了讀者指出的一些小錯誤和不恰當的表達,有些地方闡釋得不夠我又加了些筆墨,有些技術細節改用更好的實現方式,比如重寫了第 21.4 節,我認為現在用的方法比上一版要好。
體例說明
像The quick brown fox jumps over the lazy dog這樣的字型在本書中是代碼字型。這種字型的名稱是Dejavu Sans Mono,為什麼我要提倡用這種字型呢?第一,它是等寬字型,因此適合做代碼字型。第二,它的數字1和小寫字母l、數字0和大寫字母O區分得非常清楚(我在教學中發現初學者很容易把這些字元抄錯),因此它比Courier New更適合做代碼字型。第三, 它是我的Linux圖形終端的默認字型,採用這種字型排版可以使得看書和看螢幕的感覺很一致,希望讀者在看這本書時也會有這種Dejavu(似曾相識)的感覺。
像下面這樣有邊線的是代碼:
#! /bin/sh
VAR=1
VAR=$(($VAR+1))
echo $VAR
沒有邊線的是終端顯示,包括輸入的命令和程式運行結果,例如:
$ VAR=1
$ VAR=$(($VAR+1))
$ echo $VAR
2
本書中統一用$表示Shell提示符。
加粗的字句表示強調。
在定義一個名詞時會給出它的英文名稱,例如集成開發環境(Integrated Development Environment,IDE),通過書後的索引可以找到這些定義在書中首次出現的位置。

致謝

本書的寫作得到北京亞嵌教育研究中心的全力支持,尤其感謝李明老師和何家勝老師,沒有公司的支持,我不可能有時間有條件寫這本書,也不可能有機會將這本書公開在網上。另外參與本書編寫的有彭玉桃、畢吉玲、宋述禮,在此一併表示感謝。
然後要感謝亞嵌教育的歷屆學員和各位老師,在教學和討論過程中我經常會得到有益的啟發,這些都促使這本書更加完善。在本書的寫作過程中,很多讀者為本書提出很有價值的建議,很多建議是熱心網友通過線上評論提的,很多網友我只知道ID或E-mail。在此向他們表示感謝。
感謝幫助過我的老師們:李明、何家勝、邸海霞、郎鐵山、朱仲濤、廖文江、韓超、秦蔚、吳岳、張 、邢文鵬、何曉龍、林小竹、衛劍釩、郭同彬、王波、王磊、洪峰。
感謝熱心網友:ddd、wuyulei、comma、田偉、田雨、daidai、鄧楠、杜朴風、Zoom.Quiet、陳老師、楊景、章鈺、chen、Jiawei Zhang、waterloo、張現超、曾宇、董俊波、RobinXiang、劉艷明、付、cleverd、orange、徐斌、cyy、Linux_Xfce、馮海雲、侯延祥、churchmice、linux——00xx00xxooxx、syfeagle、王公僕、劉敏、Laciq、yuchen、陸楊、陳楊希、love_wc3、姚磊、芝麻、宇、沈震、bing、mick、baaluck、曹帥軍、zhoudy、朱夜光、刺蝟、san、王兆宏、徐凱、858549355、碼匠、況海斌、尹志偉、王星、趙偉峰、屈偉、Yang Yi、WPJ、lzjtu2007、張凱、tianyebj、周笑鐳、陳重遠、邱焜、不哭、860284226、戴志凌、erazy0、宋健、abc5186、Xin Wu、趙廣興、鄧學正、cowboy、Louis、張夏寧、goophile、benqktc、雲中一木、fracting、xinwu、李林、賴先科。
還要感謝電子工業出版社博文視點資訊有限公司的周筠老師和李冰老師的大力支持。
在寫作過程中我遇到過很多困難,工作繁忙、對未來迷茫、生活壓力大、缺乏安全感、個人瑣事等。然而有這么多熱心的同學、老師、朋友、網友在等著看我的書線上更新,給我提建議希望我把書改得更完善,這是我堅持寫下去的最大的動力。謝謝你們!
由於我的水平十分有限,沒寫過C編譯器和C標準庫,所以疏漏之處在所難免,如有錯誤歡迎批評指正。寫書是一件嚴肅的事,書中的錯誤所有人都看得見,白紙黑字賴不掉的。我教過的很多學生都在大學裡學過C語言,甚至考過二級,但程式寫得一塌糊塗,連最基本的概念都搞錯了,以前學過的C語言教材中的錯誤在他們腦子裡根深蒂固,即使我糾正多次,他們仍然只記得以前學過的錯誤概念,這種有基礎的學生還不如沒有任何基礎的學生教起來容易。我非常害怕我教給別人的仍然是錯的,所以我仔細研究了C99之後才敢動筆寫書。這本書涵蓋的話題比較廣泛,我竭盡全力也不足以保證書中的內容全部正確,還要依靠社區的力量一起來完善這本書,這樣才能真正對讀者負責,所以我選擇將這本書開源。
希望本書成為你求學道路上的第一個夥伴。
宋勁杉
北京2011年1月2日

目 錄

上篇 C語言入門
第1章 程式的基本概念 2
1.1 程式和程式語言 2
1.2 自然語言和形式語言 6
1.3 程式的調試 8
1.4 第一個程式 9
第2章 常量、變數和表達式 13
2.1 繼續Hello World 13
2.2 常量 16
2.3 變數 17
2.4 賦值 19
2.5 表達式 20
2.6 字元類型與字元編碼 24
第3章 簡單函式 26
3.1 數學函式 26
3.2 自定義函式 28
3.3 形參和實參 34
3.4 全局變數、局部變數和作用域 38
第4章 分支語句 44
4.1 if語句 44
4.2 if/else語句 46
4.3 布爾代數 48
4.4 switch語句 52
第5章 深入理解函式 54
5.1 return語句 54
5.2 增量式開發 57
5.3 遞歸 61
第6章 循環語句 67
6.1 while語句 67
6.2 do/while語句 69
6.3 for語句 70
6.4 break和continue語句 72
6.5 嵌套循環 73
6.6 goto語句和標號 74
第7章 結構體 78
7.1 複合類型與結構體 78
7.2 數據抽象 82
7.3 數據類型標誌 86
7.4 嵌套結構體 87
第8章 數組 89
8.1 數組的基本概念 89
8.2 數組套用實例:統計隨機數 92
8.3 數組套用實例:直方圖 95
8.4 字元串 98
8.5 多維數組 100
第9章 編碼風格 104
9.1 縮進和空白 104
9.2 注釋 108
9.3 標識符命名 112
9.4 函式 112
9.5 indent工具 113
第10章 gdb 115
10.1 單步執行和跟蹤函式調用 115
10.2 斷點 122
10.3 觀察點 126
10.4 段錯誤 130
第11章 排序與查找 133
11.1 算法的概念 133
11.2 插入排序 134
11.3 算法的時間複雜度分析 136
11.4 歸併排序 138
11.5 線性查找 143
11.6 折半查找 144
第12章 棧與佇列 149
12.1 數據結構的概念 149
12.2 堆疊 149
12.3 深度優先搜尋 151
12.4 佇列與廣度優先搜尋 157
12.5 環形佇列 162
本階段總結 163
下篇 C語言本質
第13章 計算機中數的表示 166
13.1 為什麼計算機用二進制計數 166
13.2 不同進制之間的換算 168
13.3 整數的加減運算 170
13.3.1 Sign and Magnitude表示法 170
13.3.2 1's Complement表示法 170
13.3.3 2's Complement表示法 172
13.3.4 有符號數和無符號數 173
13.4 浮點數 173
第14章 數據類型詳解 176
14.1 整型 176
14.2 浮點型 180
14.3 類型轉換 181
14.3.1 Integer Promotion 181
14.3.2 Usual Arithmetic Conversion 182
14.3.3 由賦值產生的類型轉換 183
14.3.4 強制類型轉換 183
14.3.5 編譯器如何處理類型轉換 184
第15章 運算符詳解 186
15.1 位運算 186
15.1.1 按位與、或、異或、取反運算 186
15.1.2 移位運算 187
15.1.3 掩碼 188
15.1.4 異或運算的一些特性 189
15.2 其他運算符 190
15.2.1 複合賦值運算符 190
15.2.2 條件運算符 190
15.2.3 逗號運算符 191
15.2.4 sizeof運算符與typedef類型聲明 191
15.3 Side Effect與Sequence Point 193
15.4 運算符總結 196
第16章 計算機體系結構基礎 198
16.1 記憶體與地址 198
16.2 CPU 198
16.3 設備 201
16.4 MMU 203
16.5 Memory Hierarchy 205
第17章 x86彙編程式基礎 209
17.1 最簡單的彙編程式 209
17.2 x86的暫存器 212
17.3 第二個彙編程式 212
17.4 定址方式 215
17.5 ELF檔案 216
17.5.1 目標檔案 217
17.5.2 執行檔 223
第18章 彙編與C之間的關係 229
18.1 函式調用 229
18.2 main函式、啟動例程和退出狀態 236
18.3 變數的存儲布局 242
18.4 結構體和聯合體 249
18.5 C內聯彙編 254
18.6 volatile限定符 255
第19章 連結詳解 260
19.1 多目標檔案的連結 260
19.2 定義和聲明 266
19.2.1 extern和static關鍵字 266
19.2.2 頭檔案 269
19.2.3 定義和聲明的詳細規則 274
19.3 靜態庫 276
19.4 共享庫 279
19.4.1 編譯、連結、運行 279
19.4.2 函式的動態連結過程 286
19.4.3 共享庫的命名慣例 288
19.5 虛擬記憶體管理 290
第20章 預處理 296
20.1 預處理的步驟 296
20.2 宏定義 297
20.2.1 函式式宏定義 297
20.2.2 內聯函式 300
20.2.3 #、##運算符和可變參數 301
20.2.4 #undef預處理指示 304
20.2.5 宏展開的步驟 304
20.3 條件預處理指示 305
20.4 其他預處理特性 309
第21章 Makefile基礎 312
21.1 基本規則 312
21.2 隱含規則和模式規則 319
21.3 變數 322
21.4 自動處理頭檔案的依賴關係 327
21.5 常用的make命令行選項 331
第22章 指針 334
22.1 指針的基本概念 334
22.2 指針類型的參數和返回值 337
22.3 指針與數組 339
22.4 指針與const限定符 342
22.5 指針與結構體 344
22.6 指向指針的指針與指針數組 344
22.7 指向數組的指針與多維數組 348
22.8 函式類型和函式指針類型 349
22.9 不完全類型和複雜聲明 353
第23章 函式接口 357
23.1 本章的預備知識 357
23.1.1 strcpy與strncpy 357
23.1.2 malloc與free 362
23.2 傳入參數與傳出參數 367
23.3 兩層指針的參數 368
23.4 返回值是指針的情況 370
23.5 回調函式 373
23.6 可變參數 376
第24章 C標準庫 380
24.1 字元串操作函式 381
24.1.1 給字元串賦初值 381
24.1.2 取字元串的長度 382
24.1.3 拷貝字元串 383
24.1.4 連線字元串 385
24.1.5 比較字元串 386
24.1.6 搜尋字元串 387
24.1.7 分割字元串 387
24.2 標準I/O庫函式 391
24.2.1 檔案的基本概念 391
24.2.2 fopen/fclose 392
24.2.3 stdin/stdout/stderr 395
24.2.4 errno與perror/strerror函式 396
24.2.5 以位元組為單位的I/O函式 398
24.2.6 操作讀寫位置的函式 401
24.2.7 以字元串為單位的I/O函式 403
24.2.8 以記錄為單位的I/O函式 404
24.2.9 格式化I/O函式 406
24.2.10 C標準庫的I/O緩衝區 413
24.2.11 本節綜合練習 417
24.3 數值字元串轉換函式 418
24.4 分配記憶體的函式 420
第25章 鍊表、二叉樹和哈希表 422
25.1 鍊表 422
25.1.1 單鍊表 422
25.1.2 雙向鍊表 428
25.1.3 靜態鍊表 433
25.1.4 本節綜合練習 433
25.2 二叉樹 434
25.2.1 二叉樹的基本概念 434
25.2.2 排序二叉樹 439
25.3 哈希表 443
本階段總結 445
附錄A 字元編碼 449
參考文獻 456
索引 458

相關詞條

熱門詞條

聯絡我們