譚浩強《C語言程序設(shè)計》考研考點講義_第1頁
譚浩強《C語言程序設(shè)計》考研考點講義_第2頁
譚浩強《C語言程序設(shè)計》考研考點講義_第3頁
譚浩強《C語言程序設(shè)計》考研考點講義_第4頁
譚浩強《C語言程序設(shè)計》考研考點講義_第5頁
已閱讀5頁,還剩174頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

考情分析及復(fù)習(xí)介紹 (1)第一章C語言概述 (14)第二章算法 (19)第三章數(shù)據(jù)類型、運算符與表達式 (33)第四章單的C程序設(shè)計 (49)第五章?lián)窠Y(jié)構(gòu)程序設(shè)計 (60)第六章循環(huán)控制 (69)第七章數(shù)組 (80)第八章函數(shù) (99)第九章預(yù)處理命令 (130)第十章指針 (139)第十一章結(jié)構(gòu)體與共同體 (172)第十二章位運算 (201)第十三章文件 (209)11考情分析及章節(jié)介紹◆課程特點算法的概念及其表示;數(shù)據(jù)類型、運算符與表達式;程序設(shè)計結(jié)構(gòu);數(shù)組;指針;預(yù)處理命令;文件。給定以下幾組定義,說明其含義:intpintpintpdef識點綜合運用,難于理解22 {}運行情況輸出:◆出題思路:按內(nèi)容分布、按題型分布探討按內(nèi)容分布按知識點的基礎(chǔ)內(nèi)容出題D.由所用機器的機器字長所決定A.C語言程序總是從第一個定義的函數(shù)開始執(zhí)行DCmain序的開始部分寫出下面程序的輸出結(jié)果(A) {}33 {if(x++<0)y=-1;ifxy}盤上輸入-1,則程序的輸出是(A)。C { {}}}44出題思路填空題:n7整除”的C語言邏輯表達式()。 以下程序的運行結(jié)果是(11)。 {}按題型角度:知識點的基本內(nèi)容及綜合下列標(biāo)識符中,(B)是合法的用戶定義的標(biāo)識符。以下程序的運行結(jié)果是(B) {if((++i)||(++j>0))k++;}C.枚舉元素的值可以在類型定義時指定D.枚舉元素可以作為常量使用55 程序補充:個數(shù),求其平均值。++} {*(p1+i)?。健甛0’i}*(p1+i)=\‘0’程序閱讀:寫出程序的輸出結(jié)果。+=程序閱讀:*(p1+i)=\‘0’66寫出程序的輸出結(jié)果。 { {}程序改錯:下面程序用以計算整數(shù)階乘。 {程序改錯: {77◆按題型角度:算法及知識點的綜合編程輸出10至100之間的所有素數(shù)。編程輸出100至999之間的所有水仙花數(shù)。 設(shè)任意含有10個元素的一維數(shù)組A和指針變量p,請用指針與數(shù)組關(guān)系編程輸出該數(shù)組元素內(nèi)容?!舫绦蛟O(shè)計:綜合性強假設(shè)一個文本文件中保存著100個整數(shù),請將這100個整數(shù)從大到小的順序?qū)懙搅硪粋€文件中去,并且在新文件中每10個整數(shù)占一行。源文件名和目標(biāo)文件名通過命令行參數(shù)獲取。 {nfout {} 88◆復(fù)習(xí)思路從教材的角度(按章節(jié)順序,較全面)(第一階段)從考題的角度(抓重點,找遺漏)(第二階段)從教材的角度(按章節(jié)順序,較全面)(第一階段)認真復(fù)習(xí)每個知識點,掌握C語言規(guī)則。例如:針對字符數(shù)組和字符指針變量字符數(shù)組由若干個元素組成,每個元素中放一個字符,而字符指針變量中存放的是地址(字符串第1個字符的地址),決不是將字符串放到字符指針變量中。對字符數(shù)組只能對各個元素賦值,不能用以下辦法對字符數(shù)組賦值。而對字符指針變量,可以采用下面方法賦值:char**a;對于容易混淆的知識點,善于歸納和總結(jié)有關(guān)整型的數(shù)據(jù)類型定義含義定義整型變量pintpp為指向整型數(shù)據(jù)的指針變量定義指針數(shù)組p,它由n個指向整型數(shù)據(jù)的指針元素組成intpn;p為指向含n個元素的一維數(shù)組的指針變量intp();p為帶回整型函數(shù)值的函數(shù)int*p();p為帶回一個指針的函數(shù),該指針指向整型數(shù)據(jù)int(*p)();p為指向函數(shù)的指針,該函數(shù)返回一個整型值int**p;p是一個指針變量,它指向一個指向整型數(shù)據(jù)的指針變量66培養(yǎng)認真分析的習(xí)慣,建立地址分配模型。 {}運行情況輸出:從考題的角度(抓重點,有遺漏)(第二階段)主要是出題幾率小的知識點。例如:下面符合要求的位段定義是(B)。 { { { {●按章節(jié)介紹知識點分布重點內(nèi)容必考;主要內(nèi)容●算法用自然語言表示算法用流程圖表示算法:基本程序設(shè)計結(jié)構(gòu)用偽代碼表示算法●數(shù)據(jù)類型、運算符與表達式各類數(shù)值型數(shù)據(jù)間的混合運算算術(shù)運算符和算術(shù)表達式賦值運算符和賦值表達式逗號運算符和逗號表達式●C語言程序設(shè)計賦值語句數(shù)據(jù)輸入輸出字符數(shù)據(jù)輸入輸出格式輸入與輸出●選擇結(jié)構(gòu)關(guān)系運算符和關(guān)系表達式邏輯運算符和邏輯表達式●循環(huán)控制用for語句實現(xiàn)循環(huán)循環(huán)的嵌套●數(shù)組字符串和字符串結(jié)束標(biāo)志字符數(shù)組的輸入輸出字符串處理函數(shù)●函數(shù)函數(shù)定義的一般形式、函數(shù)參數(shù)和函數(shù)的返回值數(shù)組作為函數(shù)參數(shù)局部變量和全局變量變量的存儲類別:動態(tài)存儲方式與靜態(tài)存儲方式●預(yù)處理命令參數(shù)的宏定義、帶參數(shù)的宏和函數(shù)的區(qū)別”處理條件編譯●指針地址和指針變量的指針和指向變量的指針變量數(shù)組與指針字符串與指針指向函數(shù)的指針、返回指針值的函數(shù)指針數(shù)組和指向指針的指針●結(jié)構(gòu)體與共同體結(jié)構(gòu)體數(shù)組指向結(jié)構(gòu)體類型數(shù)據(jù)的指針用指針處理鏈表共用體枚舉類型●位運算位運算符和位運算位段●文件文件類型指針文件的打開與關(guān)閉文件的讀寫文件的定位出錯的檢測文件輸入輸出復(fù)習(xí)思路知識點較多、知識點之間可以綜合應(yīng)用,復(fù)習(xí)難度大;按章節(jié)順序、全面掌握知識點,培養(yǎng)綜合分析考題的能力;從考題的角度、有重點地針對性地復(fù)習(xí)。第一章本章考點考點1C語言出現(xiàn)的歷史背景C語言概述C語言是國際上廣泛流行的高級語言,C語言是在B語言的基礎(chǔ)上發(fā)展起來的。B(BCPL)語言是1970年由美國貝爾實驗室設(shè)計的,并用于編寫了第一個UNIX操作系統(tǒng),優(yōu)點:CB原來用匯編編寫的UNIX,但僅在貝爾實驗室使用。相輔相成。1983年,美國國家標(biāo)準(zhǔn)化協(xié)會(ANSI)根據(jù)C語言各種版本對C的發(fā)展和擴充,制定了新的標(biāo)準(zhǔn)C1987年,ANSI公布新標(biāo)準(zhǔn)—87ANSIC。目前,流行的C語言編譯系統(tǒng)大多是以ANSIC為基礎(chǔ)進行開發(fā)的。說明:不同版本的C編譯系統(tǒng)所實現(xiàn)的語言功能和語法規(guī)則略有差別,因此了解所用的C語言編譯系統(tǒng)的特點??键c2C語言的特點 (2)運算符豐富。34種運算符。 (3)數(shù)據(jù)類型豐富,具有現(xiàn)代語言的各種數(shù)據(jù)結(jié)構(gòu)。 (4)具有結(jié)構(gòu)化的控制語句,是完全模塊化和結(jié)構(gòu)化的語言。 (5)語法限制不太嚴(yán)格,程序設(shè)計自由度大。 (6)允許直接訪問物理地址,能進行位操作,能實現(xiàn)匯編語言的大部分功能,可直接對硬件進行操作。 (7)目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。只比匯編程序生成的目標(biāo)代碼效率低10%-20%。 (8)程序可移植性好?;旧喜蛔鲂薷木湍苡糜诟鞣N型號的計算機和各種操作系統(tǒng)??键c3簡單的C語言程序介紹/*文件包含*//*主函數(shù)*/ /*輸出語句*/}每個C程序必須有一個主函數(shù)main {}是函數(shù)開始和結(jié)束的標(biāo)志,不可省每個C語句以分號結(jié)束voidmain()/*主函數(shù)*/ {} {}/*對被調(diào)用函數(shù)max的聲明*//*輸入變量a和b的值*//*輸出c的值*/ {/*以下3行為C語句*/}/*求兩數(shù)之和*//*聲明,定義變量為整型*/說明:/*……*/表示注釋。注釋對編譯和運行不起作用,可以用漢字或英文字符表示,可以出現(xiàn)在一行中的最右側(cè),也可以單獨成為一行。 (1)C程序是由函數(shù)構(gòu)成的,使程序容易實現(xiàn)模塊化。 (2)一個函數(shù)由兩部分組成:函數(shù)體:花括號內(nèi)的部分。若一個函數(shù)有多個花括號,則最外層的一對花括號為函數(shù)體的范圍。函數(shù)體包括兩部分:注意:函數(shù)的聲明部分和執(zhí)行部分都可缺省,例如: {}這是一個空函數(shù),什么也不做,但是合法的函數(shù)??偨Y(jié): Cmain執(zhí)行的,與main函數(shù)的位置無關(guān)。 (2)C程序書寫格式自由,一行內(nèi)可以寫幾個語句,一個語句可以分寫在多行上,C程序沒有行號。 (3)每個語句和數(shù)據(jù)聲明的最后必須有一個分號。 (4)C語言本身沒有輸入輸出語句。輸入和輸出的操作是由庫函數(shù)scanf和printf等函數(shù)來完成的。C對輸入輸出實行“函數(shù)化”??键c4運行C程序的步驟 (1)上機輸入與編輯源程序 (2)對源程序進行編譯 (3)與庫函數(shù)連接 (4)運行可執(zhí)行目標(biāo)程序 (1)目前使用的大多數(shù)C編譯系統(tǒng)都是集成環(huán)境(IDE)的??捎貌煌木幾g系統(tǒng)對C程序進行操作。 標(biāo)操作。 檪殏 檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪殏檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪殏檪殏 檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪殏主要知識點:C語言的特點:運算符豐富、模塊化和結(jié)構(gòu)化、允許直接訪問物理地址、進行位操作、可移植性好等第二章算法本章考點考點1算法的概念一個程序應(yīng)包括兩個方面的內(nèi)容:著名計算機科學(xué)家沃思提出一個公式:完整的程序設(shè)計應(yīng)該是:數(shù)據(jù)結(jié)構(gòu)+算法+程序設(shè)計方法+語言工具算法”。對同一個問題,可有不同的解題方法和步驟。例如求:∑n為了有效地進行解題,不僅需要保證算法正確,還要考慮算法的質(zhì)量,選擇合適的算法。希望方計算機算法可分為兩大類別:非數(shù)值運算:包括的面十分廣泛,最常見的是用于事務(wù)管理領(lǐng)域,例如圖書檢索、人事管理、行車調(diào)度管理等。例1求1×2×3×4×5220可以設(shè)兩個變量:一個變量代表被乘數(shù),一個變量代表乘數(shù)。不另設(shè)變量存放乘積結(jié)果,而直接將每一步驟的乘積放在被乘數(shù)變量中。設(shè)p為被乘數(shù),i為乘數(shù)。用循環(huán)算法來求結(jié)果,算法可改寫:活性。S3到S5組成一個循環(huán),在實現(xiàn)算法時,要反復(fù)多次S3步驟為止。此時算法結(jié)束,變量p的值就是所求結(jié)果。例題例2有50個學(xué)生,要求將成績在80分以上者打印出來。設(shè)n表示學(xué)號,n1代表第一個學(xué)生學(xué)號,ni代表第i個學(xué)生學(xué)號。用g代表學(xué)生成績,gi代表第i個學(xué)生成績,算法表示如下:->變量i作為下標(biāo),用來控制序號(第幾個學(xué)生,第幾個成績)。當(dāng)i超過50時,表示已對50個學(xué)生的成績處理完畢,算法結(jié)束。出。年;(2)能被100整除,又能被400整除的年份是閏年。如1600,2000年是閏年。不符合這兩個條件的年份不是閏年。設(shè)y為被檢測的年份,算法可表示如下:->221算法如下:分?jǐn)?shù)。sum最后的值就是多項式的值。例5對一個大于或等于3的正整數(shù),判斷它是不是一個素數(shù)。概念:所謂素數(shù),是指除了1和該數(shù)本身之外,不能被其它任何整數(shù)整除的數(shù)。例如,13是素數(shù)。分析:判斷一個數(shù)n(n≥3)是否素數(shù)的方法:將n作為被除數(shù),將2到(n-1)各個整數(shù)輪流作為算法如下:除即可。考點2算法的特性一個算法應(yīng)該具有以下特點:有窮性:包含有限的操作步驟。確定性:算法中的每一個步驟都應(yīng)當(dāng)是確定的。有零個或多個輸入:輸入是指在執(zhí)行算法時需要從外界取得必要的信息。有效性:算法中的每一個步驟都應(yīng)當(dāng)能有效地執(zhí)行,并得到確定的結(jié)果??键c3算法的表示222可以用不同的方法表示算法,常用的有:傳統(tǒng)流程圖結(jié)構(gòu)化流程圖偽代碼自然語言就是人們?nèi)粘J褂玫恼Z言,可以是漢語或英語或其它語言。用自然語言表示通俗易懂,含義,描述包含分支和循環(huán)的算法時也不很方便。因此,除了那些很簡單的問題外,一般不用自然語言描述算法。美國國家標(biāo)準(zhǔn)化協(xié)會ANSI規(guī)定了一些常用的流程圖符號:例7將例2的算法用流程圖表示。打印50名學(xué)生中成績在80分以上者的學(xué)號和成績。例6圖223例8將例3判定閏年的算法用流程圖表示224例9將例4的算法用流程圖表示例10將例5判斷素數(shù)的算法用流程圖表示 (圖見視頻)用流程圖表示算法總結(jié):流程圖是表示算法的較好的工具。一個流程圖包括以下幾部分: (1)表示相應(yīng)操作的框; (2)帶箭頭的流程線; (3)框內(nèi)外必要的文字說明。優(yōu)點:用流程圖表示算法要比用文字描述算法邏輯清晰、易于理解。225三、三種基本結(jié)構(gòu)和改進的流程圖傳統(tǒng)流程圖用流程線指出各框的執(zhí)行順序,對流程線的使用沒有嚴(yán)格限制。因此,使用者可以毫不受限制地使流程隨意地轉(zhuǎn)向,使流程圖變得毫無規(guī)律,閱讀者要花很大精力去追蹤流程,使人難以理解算法的邏輯。如圖:解決辦法:必須限制箭頭的濫用,即不允許無規(guī)律地使流程隨意轉(zhuǎn)向,只能順序地進行下去。用這三種基本結(jié)構(gòu)作為表示一個良好算法的基本單元。循環(huán)結(jié)構(gòu)2263.三種基本結(jié)構(gòu)的共同特點: (1)只有一個入口; (2)只有一個出口;(請注意:一個菱形判斷框有兩個出口,而一個選擇結(jié)構(gòu)只有一個出口。不要將菱形框的出口和選擇結(jié)構(gòu)的出口混淆。) (3)結(jié)構(gòu)內(nèi)的每一部分都有機會被執(zhí)行到; (4)結(jié)構(gòu)內(nèi)不存在“死循環(huán)”(無終止的循環(huán))。不正確的流程表示:總結(jié):由三種基本結(jié)構(gòu)順序組成的算法結(jié)構(gòu),可以解決任何復(fù)雜的問題。由基本結(jié)構(gòu)所構(gòu)成的算法屬于“結(jié)構(gòu)化”的算法,它不存在無規(guī)律的轉(zhuǎn)向,只在本基本結(jié)構(gòu)內(nèi)才允許存在分支和向前或向后的跳轉(zhuǎn)。只要具有上述四個特點的都可以作為基本結(jié)構(gòu)??梢宰约憾x基本結(jié)構(gòu),并由這些基本結(jié)構(gòu)組成結(jié)構(gòu)化程序。下圖符合基本結(jié)構(gòu)的特點:227如下是一個多分支選擇結(jié)構(gòu)。虛線框內(nèi)的結(jié)構(gòu)是一個入口一個出口,并且有上述全部的四個特點。由此構(gòu)成的算法結(jié)構(gòu)也是結(jié)構(gòu)化的算法??梢哉J為這是由三種基本結(jié)構(gòu)所派生出來的。 (圖見視頻)程線。全部算法寫在一個矩形框內(nèi),在該框內(nèi)還可以包含其它的從屬于它的框。這種流程圖又稱N--S結(jié)構(gòu)化流程圖。個簡單的操作,也可以是三個基本結(jié)構(gòu)之一。如下圖:A框可以是一個選擇結(jié)構(gòu),B框可以是一個循環(huán)結(jié)構(gòu)。228例12將例2的算法用N-S圖表示。(打印50名學(xué)生中成績高于80分的學(xué)號和成績)判定閏年的算法用N-S圖表示229將例5判別素數(shù)的算法用N-S流程圖表示流程圖不符合基本結(jié)構(gòu)特點!不能分解為三種基本結(jié)構(gòu),無法直接用N-S流程圖的三種基本結(jié)構(gòu)的符號來表示。因此,應(yīng)當(dāng)先作必要的變換。 (圖見視頻)總結(jié):一個結(jié)構(gòu)化的算法是由一些基本結(jié)構(gòu)順序組成的。在基本結(jié)構(gòu)之間不存在向前或向后的跳轉(zhuǎn),流程的轉(zhuǎn)移只存在于一個基本結(jié)構(gòu)范圍之內(nèi)(如循環(huán)中流程的跳轉(zhuǎn));一個非結(jié)構(gòu)化的算法可以用一個等價的結(jié)構(gòu)化算法代替,其功能不變。如果一個算法不能分解為若干個基本結(jié)構(gòu),則它必然不是一個結(jié)構(gòu)化的算法。優(yōu)點:比文字描述直觀、形象、易于理解;比傳統(tǒng)流程圖緊湊易畫。尤其是它廢除了流程線,整個算法結(jié)構(gòu)是由各個基本結(jié)構(gòu)按順序組成的,N--S流程圖中的上下順序就是執(zhí)行時的順序。用N--S圖表示的算法都是結(jié)構(gòu)化的算法,因為它不可能出現(xiàn)流程無規(guī)律的跳轉(zhuǎn),而只能自上而下地順序執(zhí)行。概念:偽代碼是用介于自然語言和計算機語言之間的文字和符號來描述算法。特點:如同一篇文章一樣,自上而下地寫下來。每一行(或幾行)表示一個基本操作。不用圖形符號,書寫方便、格式緊湊,比較好懂,便于向計算機語言算法(即程序)過渡。用處:適用于設(shè)計過程中需要反復(fù)修改時的流程描述。330可以用漢字偽代碼表示:若x為正打印x否則也可以中英文混用。開始置t的初值為1置i的初值為2使t=t×i {循環(huán)體到此結(jié)束}輸出t的值結(jié)束例17輸出50個學(xué)生中成績高于80分者的學(xué)號和成績。用偽代碼表示算法:BEGIN{算法開始} END{算法結(jié)束}概念:用計算機實現(xiàn)算法。計算機是無法識別流程圖和偽代碼的。只有用計算機語言編寫的程序才能被計算機執(zhí)行。因此在用流程圖或偽代碼描述出一個算法后,還要將它轉(zhuǎn)換成計算機語言331程序。特點:用計算機語言表示算法必須嚴(yán)格遵循所用的語言的語法規(guī)則,這是和偽代碼不同的。用處:要完成一件工作,包括設(shè)計算法和實現(xiàn)算法兩個部分。設(shè)計算法的目的是為了實現(xiàn)算法。例20將例16表示的算法(求5!)用C語言表示。 {t=t*I;}}應(yīng)當(dāng)強調(diào)說明:寫出了C程序,仍然只是描述了算法,并未實現(xiàn)算法。只有運行程序才是實現(xiàn)算法。應(yīng)該說,用計算機語言表示的算法是計算機能夠執(zhí)行的算法??键c4結(jié)構(gòu)化程序設(shè)計方法一個結(jié)構(gòu)化程序:就是用高級語言表示的結(jié)構(gòu)化算法。用三種基本結(jié)構(gòu)組成的程序必然是結(jié)構(gòu)結(jié)構(gòu)化程序設(shè)計強調(diào)程序設(shè)計風(fēng)格和程序結(jié)構(gòu)的規(guī)范化,提倡清晰的結(jié)構(gòu)。結(jié)構(gòu)化程序設(shè)計方法的基本思路是:把一個復(fù)雜問題的求解過程分階段進行,每個階段處理的問題都控制在人們?nèi)菀桌斫夂吞幚淼姆秶鷥?nèi)。采取以下方法來保證得到結(jié)構(gòu)化的程序:逐步細化;模塊化設(shè)計;結(jié)構(gòu)化編碼。兩種不同的方法: (圖見視頻)332檪殏 檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪殏用這種方法逐步分解,直到作者認為可以直接將各小段表達為文字語句為止。這種方法就叫做“自頂向下檪殏 檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪殏考慮周全,結(jié)構(gòu)清晰,層次分明,作者容易寫,讀者容易看。如果發(fā)現(xiàn)某一部分中有一段內(nèi)容不落即可,與其它部分無關(guān)。模塊設(shè)計的方法: (1)模塊化設(shè)計的思想實際上是一種“分而治之”的思想,把一個大任務(wù)分為若干個子任務(wù),每一個子任務(wù)就相對簡單。 (2)在拿到一個程序模塊以后,根據(jù)程序模塊的功能將它劃分為若干個子模塊,如果這些子模塊的規(guī)模還嫌大,還再可以劃分為更小的模塊。這個過程采用自頂向下方法來實現(xiàn)。 (3)子模塊一般不超過50行。 (4)劃分子模塊時應(yīng)注意模塊的獨立性,即:使一個模塊完成一項功能,耦合性愈少愈好。檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪殏本章小結(jié)主要知識點:S程圖等333第三章本章考點考點1C的數(shù)據(jù)類型C語言提供的數(shù)據(jù)類型:指針類型數(shù)據(jù)類型、運算符與表達式考點2常量與變量在程序運行過程中,其值不能被改變的量稱為常量。常量區(qū)分為不同的類型:例1符號常量的使用 {880第七章數(shù)組本章考點考點1一維數(shù)組的定義和引用數(shù)組:是一組具有相同數(shù)據(jù)類型的數(shù)據(jù)的有序集合。類型說明符數(shù)組名[常量表達式];a此數(shù)組有10個元素。 (1)數(shù)組名定名規(guī)則和變量名相同,遵循標(biāo)識符定名規(guī)則。 (2)在定義數(shù)組時,要指定數(shù)組中元素的個數(shù),方括弧中的常量表達式用來表示元素的個數(shù),即數(shù)組長度。 (3)常量表達式中可以包括常量和符號常量,但不能包含變量。即,C語言不允許對數(shù)組的大小作動態(tài)定義,即數(shù)組的大小不依賴于程序運行過程中變量的值。例如,下面這樣定義數(shù)組是不行的:數(shù)組說明中其他常見的錯誤①floata[0];/*數(shù)組大小為0沒有意義*/②intb(2)(3);/*不能使用圓括號*/intkak;/*不能用變量說明數(shù)組大小*/3.一維數(shù)組在內(nèi)存中的存放881每個數(shù)據(jù)元素占用的字節(jié)數(shù),就是基類型的字節(jié)數(shù)。一個元素占4個字節(jié)。數(shù)組名[下標(biāo)]下標(biāo)可以是整型常量或整型表達式。aa[5]+a[7]-a[2*3]注意:定義數(shù)組時用到的“數(shù)組名[常量表達式]”和引用數(shù)組元素時用到的“數(shù)組名[下標(biāo)]”是有區(qū)別的。例如∶inta[10];/*定義數(shù)組長度為10*/t=a[6];/*引用a數(shù)組中序號為6的元素。此時6不代表數(shù)組長度*/2.一維數(shù)組元素引用的程序?qū)嵗?{}運行結(jié)果如下:98765432101.對數(shù)組元素初始化的實現(xiàn)方法:882 (1)在定義數(shù)組時對數(shù)組元素賦以初值。例如:將數(shù)組元素的初值依次放在一對花括弧內(nèi)。經(jīng)過上面的定義和初始化之后: (2)可以只給一部分元素賦值。例如:定義a數(shù)組有10個元素,但花括弧內(nèi)只提供5個初值,這表示只給前面5個元素賦初值,后5個 (3)如果想使一個數(shù)組中全部元素值為0,可以寫成這是與FORTRAN語言不同的,不能給數(shù)組整體賦初值。 (4)在對全部數(shù)組元素賦初值時,由于數(shù)據(jù)的個數(shù)已經(jīng)確定,因此可以不指定數(shù)組長度。例如: 在第二種寫法中,花括弧中有5個數(shù),系統(tǒng)就會據(jù)此自動定義a數(shù)組的長度為5。但若數(shù)組長度與提供初值的個數(shù)不相同,則數(shù)組長度不能省略。例如,想定義數(shù)組長度為10,就不能省略數(shù)組長度程序?qū)嵗?{f[i]=f[i-2]+f[i-1];883 {if(i%5==0)printf(″\n″);}/*For循環(huán)結(jié)束*/}/*程序結(jié)束*/舉例2:用起泡法對10個數(shù)排序(由小到大)。起泡法的思路是:將相鄰兩個數(shù)比較,將小的調(diào)到前頭注意:經(jīng)過第一趟(共5次比較與交換)后,最大的數(shù)9已“沉底”。然后進行對余下的前面5個數(shù)第二趟比較。注意:經(jīng)過第二趟(共4次比較與交換)后,得到次大的數(shù)8。如果有n個數(shù),則要進行n-1趟比較。在第1趟比較中要進行n-1次兩兩比較,在第j趟比較中要進行n-j次兩兩比較。程序流程圖如下: {884++ {}++printf(″\n″);}程序運行結(jié)果如下:‘3考點2二維數(shù)組的定義和引用二維數(shù)組定義的一般形式為類型說明符數(shù)組名[常量表達式][常量表達式];例:定義a為3×4(3行4列)的數(shù)組,b為5×10(5行10列)的數(shù)組。如下:不能寫成注意:可以把二維數(shù)組看作是一種特殊的一維數(shù)組:它的元素又是一個一維數(shù)組。885個元素的一維數(shù)組。二維數(shù)組在內(nèi)存中的存放二維數(shù)組中的元素在內(nèi)存中的排列順序是:按行存放,即先順序存放第一行的元素,再存放第二行的元素…下圖表示對a[3][4]數(shù)組存放的順序有了二維數(shù)組的基礎(chǔ),那么多維數(shù)組如何定義呢?定義三維數(shù)組:floata[2][3][4];多維數(shù)組元素在內(nèi)存中的排列順序:第一維的下標(biāo)變化最慢,最右邊的下標(biāo)變化最快。二維數(shù)組元素的表示形式為:數(shù)組名[下標(biāo)][下標(biāo)]886例如:a[2][3]是整型表達式,如a[2-1][2*2-1],例如:b[1][2]=a[2][3]/2在使用數(shù)組元素時,應(yīng)該注意下標(biāo)值應(yīng)在已定義的數(shù)組大小的范圍內(nèi)。常出現(xiàn)的錯誤有:inta[3][4];/*定義a為3×4的數(shù)組*/┆數(shù)據(jù)類型數(shù)組名[常量表達式1][常量表達式2]={初始化數(shù)據(jù)};可以用下面4種方法對二維數(shù)組初始化 (1)分行給二維數(shù)組賦初值。如: (2)可以將所有數(shù)據(jù)寫在一個花括弧內(nèi),按數(shù)組排列的順序?qū)Ω髟刭x初值。如: (3)可以對部分元素賦初值。如100050009000也可以對各行中的某一元素賦初值,如1000060000011也可以只對某幾行元素賦初值。如100056000000 (4)如果對全部元素都賦初值,則定義數(shù)組時對第一維的長度可以不指定,但第二維的長度不能省。如:8787等價于:在定義時也可以只對部分元素賦初值而省略第一維的長度,但應(yīng)分行賦初值。如:03000001000例4將一個二維數(shù)組行和列元素互換,存到另一個二維數(shù)組中。 { { ijb[j][i]=a[i][j];}printf(″\n″);} {printf(″\n″);}}/*程序結(jié)束*/運行結(jié)果如下:888536例5有一個3×4的矩陣,要求編程序求出其中值最大的那個元素的值,以及其所在的行號和列號。程序如下: { }889}/*程序結(jié)束*/考點3字符數(shù)組定義方法與前面介紹的類似。例如:用來存放字符數(shù)據(jù)的數(shù)組是字符數(shù)組。字符數(shù)組中的一個元素存放一個字符。對字符數(shù)組初始化,最容易理解的方式是逐個字符賦給數(shù)組中各元素。如:如果在定義字符數(shù)組時不進行初始化,則數(shù)組中各元素的值是不可預(yù)料的。如果花括弧中提供的初值個數(shù)(即字符個數(shù))大于數(shù)組長度,則按語法錯誤處理。如果初值個數(shù)小于數(shù)組長度,則只將這些字符賦給數(shù)組中前面那些元素,其余的元素自動定為空字符(即′\0′)。例如: (圖見視頻)如果提供的初值個數(shù)與預(yù)定的數(shù)組長度相同,在定義時可以省略數(shù)組長度,系統(tǒng)會自動根據(jù)初值個數(shù)確定數(shù)組長度。例如:c也可以定義和初始化一個二維字符數(shù)組。例如:按函數(shù)在程序中出現(xiàn)的位置來分,可以有以下三種函數(shù)調(diào)用方式:把函數(shù)調(diào)用作為一個語句。如例1中的printstar(),這時不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作。函數(shù)出現(xiàn)在一個表達式中,這種表達式稱為函數(shù)表達式。這時要求函數(shù)帶回一個確定的值以參函數(shù)調(diào)用作為一個函數(shù)的實參。例如:函數(shù)調(diào)用作為函數(shù)的參數(shù),實質(zhì)上也是函數(shù)表達式形式調(diào)用的一種,因為函數(shù)的參數(shù)本來就要求是表達式形式。三、對被調(diào)用函數(shù)的聲明和函數(shù)原型在一個函數(shù)中調(diào)用另一函數(shù)(即被調(diào)用函數(shù))需要具備哪些條件呢? (1)首先被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)(是庫函數(shù)或用戶自己定義的函數(shù))。但光有這一條件還不夠。 (2)如果使用庫函數(shù),還應(yīng)該在本文件開頭用#include命令將調(diào)用有關(guān)庫函數(shù)時所需用到的信息“包含”到本文件中來。 (3)如果使用用戶自己定義的函數(shù),而該函數(shù)的位置在調(diào)用它的函數(shù)(即主調(diào)函數(shù))的后面(在同一個文件中),應(yīng)該在主調(diào)函數(shù)中對被調(diào)用的函數(shù)作聲明。函數(shù)原型的一般形式為 (1)函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型2……); (2)函數(shù)類型函數(shù)名(參數(shù)類型1參數(shù)名1,參數(shù)類型2參數(shù)名2,……);聲明的作用是把函數(shù)名、函數(shù)參數(shù)的個數(shù)和參數(shù)類型等信息通知編譯系統(tǒng),以便在遇到函數(shù)調(diào)用時,編譯系統(tǒng)能正確識別函數(shù)并檢查調(diào)用是否合法。(例如函數(shù)名是否正確,實參與形參的類型和個數(shù)是否一致)?;厥隆:瘮?shù)的定義是指對函數(shù)功能的確立,包括指定函數(shù)名,函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個完整的、獨立的函數(shù)單位。而函數(shù)的聲明的作用則是把函數(shù)的名字、函數(shù)類型以及形參的類型、個數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時系統(tǒng)按此進行對照檢查。例5對被調(diào)用的函數(shù)作聲明 /*對被調(diào)用函數(shù)add的聲明*/} floatz/*函數(shù)體*/}如果被調(diào)用函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,可以不必加以聲明。因為編譯系統(tǒng)已經(jīng)先知道了已定義函數(shù)的有關(guān)情況,會根據(jù)函數(shù)首部提供的信息對函數(shù)的調(diào)用作正確性檢查。改寫例5/*函數(shù)首部*//*函數(shù)體*/ {}考點5函數(shù)的嵌套調(diào)用嵌套定義就是在定義一個函數(shù)時,其函數(shù)體內(nèi)又包含另一個函數(shù)的完整定義。C語言不能嵌套定義函數(shù),但可以嵌套調(diào)用函數(shù),也就是說,在調(diào)用一個函數(shù)的過程中,又調(diào)用另一個函數(shù)。方法: xxfxfxxx個根。如果f 保證(x1,x2)區(qū)間內(nèi)只有一個根。 (2)連接(x1,f(x1))和(x2,f(x2))兩點,此線(即弦)交x軸于x。 (4)重復(fù)步驟(2)和(3),直到|f(x)|<ε為止,ε為一個很小的數(shù),例如10-6.此時認為f (圖見視頻)分別用幾個函數(shù)來實現(xiàn)各部分功能: {}xpointx*/ {y=(x1*f(x2)-x2*f(x1))/ (f(x2)-f(x1));}root,求近似根*/ {if(y*y1>0) }voidmain()/**主函數(shù)**/ {ff}考點6函數(shù)的遞歸調(diào)用在調(diào)用一個函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。C語言的特點之一就在于允許函數(shù)的遞歸調(diào)用。例如: {}例7有5個人坐在一起,問第5個人多少歲?他說比第4個人大2歲。問第4個人歲數(shù),他說比第3個人大2歲。問第3個人,又說比第2個人大2歲。問第2個人,說比第1個人大2歲。最后10歲。請問第5個人多大??梢杂脭?shù)學(xué)公式表述如下: 可以用一個函數(shù)來描述上述遞歸過程:intage(intn)/**求年齡的遞歸函數(shù)**/ {intc;/*c用作存放函數(shù)的返回值的變量*/}age5人的年齡。 {}例8用遞歸方法求n!可用下面的遞歸公式表示:例9Hanoi(漢諾)塔問題。這是一個古典的數(shù)學(xué)問題,是一個用遞歸方法解題的典型例子。問在下,小的在上。現(xiàn)在想把這64個盤子從A座移到C座,但每次只允許移動一個盤,且在移動過程中在3個座上都始終保持大盤在下,小盤在上。在移動過程中可以利用B座,要求編程序打印出移動的步驟。為便于理解,先分析將A座上3個盤子移到C座上的過程: (1)將A座上2個盤子移到B座上(借助C); (2)將A座上1個盤子移到C座上; (3)將B座上2個盤子移到C座上(借助A)。其中第(2)步可以直接實現(xiàn)。第1步又可用遞歸方法分解為:由上面的分析可知:將n個盤子從A座移到C座可以分解為以下3個步驟: (1)將A上n-1個盤借助C座先移到B座上。 (2)把A座上剩下的一個盤移到C座上。 (3)將n-1個盤從B座借助于A座移到C座上。程序如下: {/*對hanoi函數(shù)的聲明*/} { }}e {}運行情況如下:考點7數(shù)組作為函數(shù)參數(shù)由于實參可以是表達式,而數(shù)組元素可以是表達式的組成部分,因此數(shù)組元素當(dāng)然可以作為函數(shù)例10有兩個數(shù)組a和b,各有10個元素,將它們對應(yīng)地逐個相比(即a[0]與b[0]比,a[1]與b [1]比等)。如果a數(shù)組中的元素大于b數(shù)組中的相應(yīng)元素的數(shù)目多于b數(shù)組中元素大于a數(shù)組中相應(yīng)元素的數(shù)目(例如a[i]>b[i]6次,b[i]>a[i]3次,其中i每次為不同的值),則認為a數(shù)組大于b printf(″\n″);printf(″\n″);++ }} }運行情況如下:1357986420‘5389-1-35604‘a(chǎn)[i]>b[i]4timesaibi1timesa[i]<b[i]5times可以用數(shù)組名作函數(shù)參數(shù),此時形參應(yīng)當(dāng)用數(shù)組名或用指針變量。 /*函數(shù)聲明*/printf(″\n″);} }運行情況如下:例12形參數(shù)組不定義長度 } }運行結(jié)果如下:例13用選擇法對數(shù)組中10個整數(shù)按由小到大排序。所謂選擇法就是先將10個數(shù)中最小的數(shù)與a[0]對換;再將a[1]到a[9]中最小的數(shù)與a[1]對換……每比較一輪,找出一個未經(jīng)排序的數(shù)中最小的一個。共比較9輪。a[0]a[1]a[2]a[3]a[4]316613994未排序時的情況4將5個數(shù)中最小的數(shù)1與a[0]對換13694將余下的4個數(shù)中最小的數(shù)3與a[1]對換13496將余下的3個數(shù)中最小的數(shù)4與a[2]對換13469將余下的2個數(shù)中最小的數(shù)6與a[3]對換,至此完成排序程序?qū)嵗?++++printf(″\n″);} ++ ++}} } }運行結(jié)果如下:考點8局部變量和全局變量在一個函數(shù)內(nèi)部定義的變量是內(nèi)部變量,它只在本函數(shù)范圍內(nèi)有效,也就是說只有在本函數(shù)內(nèi)才能使用它們,在此函數(shù)以外是不能使用這些變量的。這稱為“局部變量”。 } } }說明:/**函數(shù)f1**//**函數(shù)f2*//**主函數(shù)**/ (1)主函數(shù)中定義的變量(m,n)也只在主函數(shù)中有效,而不因為在主函數(shù)中定義而在整個文件或程序中有效。主函數(shù)也不能使用其他函數(shù)中定義的變量。 (2)不同函數(shù)中可以使用相同名字的變量,它們代表不同的對象,互不干擾。例如,上面在f1函 (3)形式參數(shù)也是局部變量。例如上面f1函數(shù)中的形參a,也只在f1函數(shù)中有效。其他函數(shù)可fa (4)在一個函數(shù)內(nèi)部,可以在復(fù)合語句中定義變量,這些變量只在本復(fù)合語句中有效,這種復(fù)合語 }}在函數(shù)內(nèi)定義的變量是局部變量,而在函數(shù)之外定義的變量稱為外部變量,外部變量是全局變量 (稱全程變量)。全局變量可以為本文件中其他函數(shù)所共用。它的有效范圍為從定義變量的位置開始到本源文件結(jié)束。 }/*外部變量*//*定義函數(shù)f1*//*外部變量**//*定義函數(shù)f2*/ } }/**主函數(shù)**/ ++}/*定義函數(shù),形參為數(shù)組*/ ++ }}建議不在必要時不要使用全局變量,原因如下:①全局變量在程序的全部執(zhí)行過程中都占用存儲單元,而不是僅在需要時才開辟單元。②使用全局變量過多,會降低程序的清晰性,人們往往難以清楚地判斷出每個瞬時各個外部變量的值。在各個函數(shù)執(zhí)行時都可能改變外部變量的值,程序容易出錯。因此,要限制使用全局變量。③它使函數(shù)的通用性降低,因為函數(shù)在執(zhí)行時要依賴于其所在的外部變量。如果將一個函數(shù)移到另一個文件中,還要將有關(guān)的外部變量及其值一起移過去。但若該外部變量與其他文件的變量同名時,就會出現(xiàn)問題,降低了程序的可靠性和通用性。一般要求把C程序中的函數(shù)做成一個封閉體,除了可以通過“實參—形參”的渠道與外界發(fā)生聯(lián)系外,沒有其他渠道。例16外部變量與局部變量同名 } }運行結(jié)果為8考點9變量的存儲類別/*a,b為局部變量*/一、動態(tài)存儲方式與靜態(tài)存儲方式前面已介紹了從變量的作用域(即從空間)角度來分,可以分為全局變量和局部變量。那么從變量值存在的時間(即生存期)角度來分,又可以分為靜態(tài)存儲方式和動態(tài)存儲方式。所謂靜態(tài)存儲方式是指在程序運行期間由系統(tǒng)分配固定的存儲空間的方式。而動態(tài)存儲方式則是在程序運行期間根據(jù)需要進行動態(tài)的分配存儲空間的方式。這個存儲空間可以分為三部分:程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)在C語言中每一個變量和函數(shù)有兩個屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲類別。對數(shù)據(jù)類型,讀者已熟悉(如整型、字符型等)。存儲類別指的是數(shù)據(jù)在內(nèi)存中存儲的方式。存儲方式分為兩大類:靜態(tài)存儲根據(jù)變量的存儲類別,可以知道變量的作用域和生存期。如不專門聲明為static存儲類別,都是動態(tài)地分配存儲空間的,數(shù)據(jù)存儲在動態(tài)存儲區(qū)中。函數(shù)中的形參和在函數(shù)中定義的變量(包括在復(fù)合語句中定義的變量),都屬此類,在調(diào)用該函數(shù)時系統(tǒng)會給它們分配存儲空間,在函數(shù)調(diào)用結(jié)束時就自動釋放這些存儲空間。因此這類局部變量稱為自動變量。自動變量用關(guān)鍵字auto作存儲類別的聲明。例如:intf(inta)/*定義f函數(shù),a為形參*/ }有時希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即其占用的存儲單元不釋放,在下一次該函數(shù)調(diào)用時,該變量已有值,就是上一次函數(shù)調(diào)用結(jié)束時的值。這時就應(yīng)該指定該局部變量為“靜態(tài)局部變量”,用關(guān)鍵字static進行聲明。通過下面簡單的例子可以了解它的特點。例17考察靜態(tài)局部變量的值。 } }對靜態(tài)局部變量的說明: (1)靜態(tài)局部變量屬于靜態(tài)存儲類別,在靜態(tài)存儲區(qū)內(nèi)分配存儲單元。在程序整個運行期間都不釋放。而自動變量(即動態(tài)局部變量)屬于動態(tài)存儲類別,占動態(tài)存儲區(qū)空間而不占靜態(tài)存儲區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。 (2)對靜態(tài)局部變量是在編譯時賦初值的,即只賦初值一次,在程序運行時它已有初值。以后每次調(diào)用函數(shù)時不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時的值。而對自動變量賦初值,不是在編譯時進行的,而是在函數(shù)調(diào)用時進行,每調(diào)用一次函數(shù)重新給一次初值,相當(dāng)于執(zhí)行一次賦值語句。 (3)如在定義局部變量時不賦初值的話,則對靜態(tài)局部變量來說,編譯時自動賦初值0(對數(shù)值型變量)或空字符(對字符變量)。而對自動變量來說,如果不賦初值則它的值是一個不確定的值。這是由于每次函數(shù)調(diào)用結(jié)束后存儲單元已釋放,下次調(diào)用時又重新另分配存儲單元,而所分配的單元中的值是不確定的。 (4)雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)是不能引用它的。例18輸出1到5的階乘值。 } f=f*n;}一般情況下,變量(包括靜態(tài)存儲方式和動態(tài)存儲方式)的值是存放在內(nèi)存中的。當(dāng)程序中用到哪一個變量的值時,由控制器發(fā)出指令將內(nèi)存中該變量的值送到運算器中。經(jīng)過運算器進行運算,如果需要存數(shù),再從運算器將數(shù)據(jù)送到內(nèi)存存放。如果有一些變量使用頻繁(例如在一個函數(shù)中執(zhí)行10000次循環(huán),每次循環(huán)中都要引用某局部變量),則為存取變量的值要花費不少時間。為提高執(zhí)行效率,C語言允許將局部變量的值放在CPU中的寄存器中,需要用時直接從寄存器取出參加運算,不必再到內(nèi)存中去存取。由于對寄存器的存取速度遠高于對內(nèi)存的存取速度,因此這樣做可以提高執(zhí)行效率。這種變量叫做寄存器變量,用關(guān)鍵字例19使用寄存器變量 } f=f*i;}外部變量是在函數(shù)的外部定義的全局變量,它的作用域是從變量的定義處開始,到本程序文件的末尾。在此作用域內(nèi),全局變量可以為程序中各個函數(shù)所引用。編譯時將外部變量分配在靜態(tài)存儲區(qū)。有時需要用extern來聲明外部變量,以擴展外部變量的作用城。個文件內(nèi)聲明外部變量例20用extern聲明外部變量,擴展它在程序文件中的作用域。 } }2.在多文件的程序中聲明外部變量例21用extern將外部變量的作用域擴展到其他文件。本程序的作用是給定b的值,輸入a和 /*定義外部變量*//*函數(shù)聲明*/}/*聲明A為一個已定義的外部變量*/ {y*=A;}有時在程序設(shè)計中希望某些外部變量只限于被本文件引用,而不能被其他文件引用。這時可以在定義外部變量時加一個static聲明。例如: {} {…對變量而言,聲明與定義的關(guān)系稍微復(fù)雜一些。在聲明部分出現(xiàn)的變量有兩種情況:一種是需要 一般為了敘述方便,把建立存儲空間的聲明稱定義,而把不需要建立存儲空間的聲明稱為聲明。顯然這里指的聲明是狹義的,即非定義性聲明。例如: }/*是聲明不是定義。聲明A是一個已定義的外部變量*/存儲類別小結(jié) (1)從作用域角度分,有局部變量和全局變量。它們采用的存儲類別如下:局部變量全局變量 (離開函數(shù),值就消失)|靜態(tài)局部變量(離開函數(shù),值仍保留)|寄存器變量(離開函數(shù),值就消失)|(形式參數(shù)可以定義為自動變量或寄存器變量)|靜態(tài)外部變量(只限本文件引用) (即非靜態(tài)的外部變量,允許其他文件引用) (2)從變量存在的時間(生存期)來區(qū)分,有動態(tài)存儲和靜態(tài)存儲兩種類型。靜態(tài)存儲是程序整個運行時間都存在,而動態(tài)存儲則是在調(diào)用函數(shù)時臨時分配單元。動態(tài)存儲靜態(tài)存儲|自動變量(本函數(shù)內(nèi)有效)|寄存器變量(本函數(shù)內(nèi)有效)|形式參數(shù)(本函數(shù)內(nèi)有效)|靜態(tài)局部變量(函數(shù)內(nèi)有效)|靜態(tài)外部變量(本文件內(nèi)有效)|外部變量(其他文件可引用) (3)從變量值存放的位置來區(qū)分,可分為:內(nèi)存中靜態(tài)存儲區(qū)|靜態(tài)局部變量|靜態(tài)外部變量(函數(shù)外部靜態(tài)變量)|外部變量(可為其他文件引用)內(nèi)存中動態(tài)存儲區(qū):自動變量和形式參數(shù) (4)關(guān)于作用域和生存期的概念。從前面敘述可以知道,對一個變量的性質(zhì)可以從兩個方面分析,一是變量的作用域,一是變量值存在時間的長短,即生存期。前者是從空間的角度,后者是從時間的角度。二者有聯(lián)系但不是同一回事。 (5)static對局部變量和全局變量的作用不同。對局部變量來說,它使變量由動態(tài)存儲方式改變?yōu)殪o態(tài)存儲方式。而對全局變量來說,它使變量局部化(局部于本文件),但仍為靜態(tài)存儲方式。從作用域角度看,凡有static聲明的,其作用域都是局限的,或者是局限于本函數(shù)內(nèi)(靜態(tài)局部變量),或者局限于本文件內(nèi)(靜態(tài)外部變量)??键c10內(nèi)部函數(shù)和外部函數(shù)函數(shù)本質(zhì)上是全局的,因為一個函數(shù)要被另外的函數(shù)調(diào)用,但是,也可以指定函數(shù)不能被其他文件調(diào)用。根據(jù)函數(shù)能否被其他源文件調(diào)用,將函數(shù)區(qū)分為內(nèi)部函數(shù)和外部函數(shù)。如果一個函數(shù)只能被本文件中其他函數(shù)所調(diào)用,它稱為內(nèi)部函數(shù)。在定義內(nèi)部函數(shù)時,在函數(shù)名static類型標(biāo)識符函數(shù)名(形參表) (1)在定義函數(shù)時,如果在函數(shù)首部的最左端加關(guān)鍵字extern,則表示此函數(shù)是外部函數(shù),可供其他文件調(diào)用。如函數(shù)首部可以寫為externintfun(inta,intb)Cextern部函數(shù)。 (2)在需要調(diào)用此函數(shù)的文件中,用extern對函數(shù)作聲明,表示該函數(shù)是在其他文件中定義的外部函數(shù)例22有一個字符串,內(nèi)有若干個字符,今輸入一個字符,要求程序?qū)⒆址性撟址麆h去。用外部函數(shù)實現(xiàn) 義的3個函數(shù)*/} } } {}運行情況如下: (輸入str) (輸入要刪去的字符) (輸出已刪去指定字符的字符串)檪殏 檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪殏檪殏 檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪殏檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪殏本章小結(jié)主要知識點:函數(shù)的概念函數(shù)的定義與調(diào)用函數(shù)的遞歸調(diào)用變量的作用域函數(shù)的作用域第九章預(yù)處理命令本章考點ANSIC標(biāo)準(zhǔn)規(guī)定可以在C源程序中加入一些“預(yù)處理命令”,以改進程序設(shè)計環(huán)境,提高編程效率。這些預(yù)處理命令是由ANSIC統(tǒng)一規(guī)定的,但是它不是C語言本身的組成部分,不能直接對它們進行編譯(因為編譯程序不能識別它們)。必須在對程序進行通常的編譯之前,先對程序中這些特殊的命令進行“預(yù)處理”經(jīng)過預(yù)處理后程序可由編譯程序?qū)︻A(yù)處理后的源程序進行通常的編譯處理,得到可供執(zhí)行的目標(biāo)代碼。C語言與其他高級語言的一個重要區(qū)別是可以使用預(yù)處理命令和具有預(yù)處理的功能。C提供的預(yù)處理功能主要有以下三種:這些功能分別用宏定義命令、文件包含命令、條件編譯命令來實現(xiàn)。為了與一般C語句相區(qū)別,考點1宏定義宏定義的作用是在本程序文件中用指定的標(biāo)識符PI來代替“3.1415926”這個字符串,在編譯預(yù)處理時,將程序中在該命令以后出現(xiàn)的所有的PI都用“3.1415926”代替。這種方法使用戶能以一個簡單的名字代替一個長的字符串.這個標(biāo)識符(名字)稱為“宏名”例1使用不帶參數(shù)的宏定義 l=2.0*PI*r;s=PI*r*r;v=4.0/3*PI*r*r*r;}運行情況如下:說明: (1)宏名一般習(xí)慣用大寫字母表示,以便與變量名相區(qū)別。但這并非規(guī)定,也可用小寫字母。 (2)使用宏名代替一個字符串,可以減少程序中重復(fù)書寫某些字符串的工作量。 (3)宏定義是用宏名代替一個字符串,只作簡單置換,不作正確性檢查。只有在編譯已被宏展開后的源程序時才會發(fā)現(xiàn)語法錯誤并報錯。 (4)宏定義不是C語句,不必在行末加分號。如果加了分號則會連分號一起進行置換。 (5)#define命令出現(xiàn)在程序中函數(shù)的外面,宏名的有效范圍為定義命令之后到本源文件結(jié)束。 (6)可以用#undef命令終止宏定義的作用域。nt }-----↓----f1() {} (7)在進行宏定義時,可以引用已定義的宏名,可以層層置換。例9.2在宏定義中引用已定義的宏名R {}運行情況如下:printfLprintf函數(shù)調(diào)用語句展開為: (8)對程序中用雙撇號括起來的字符串內(nèi)的字符,即使與宏名相同,也不進行置換。 (9)宏定義是專門用于預(yù)處理命令的一個專用名詞,它與定義變量的含義不同,只作字符替換,不分配內(nèi)存空間。二、帶參數(shù)的宏定義作用:不是進行簡單的字符串替換,還要進行參數(shù)替換。帶參數(shù)的宏定義一般形式為:define(參數(shù)表)字符串字符串中包含在括弧中所指定的參數(shù):數(shù)a和b,用3*2代替S(3,2)。因此賦值語句展開對帶參的宏定義是這樣展開置換的:對帶實參的宏(如S(3,2),則按#define命令行中指定的字符串從左到右進行置換。若串中包含宏中的形參(如a、b),則將程序中相應(yīng)的實參(可以是常量、變量或表達式)代替形參。如果宏定義中的字符串中的字符不是參數(shù)字符(如a*b中的*號),則保留。這樣就形成了置換的字符串。例3使用帶參的宏 }運行情況如下:說明: (1)對帶參數(shù)的宏展開只是將語句中的宏名后面括號內(nèi)的實參字符串代替#define命令行中的形參。 (2)在宏定義時,在宏名與帶參數(shù)的括弧之間不應(yīng)加空格,否則將空格以后的字符都作為替代字符串的一部分。帶參數(shù)的宏和函數(shù)的區(qū)別: (1)函數(shù)調(diào)用時,先求出實參表達式的值,然后代入形參。而使用帶參的宏只是進行簡單的字符替換。 (2)函數(shù)調(diào)用是在程序運行時處理的,為形參分配臨時的內(nèi)存單元。而宏展開則是在編譯前進行 (3)對函數(shù)中的實參和形參類型要求一致。而宏名無類型,它的參數(shù)也無類型,只是一個符號代表,展開時代入指定的字符串即可。宏定義時,字符串可以是任何類型的數(shù)據(jù)。 (4)調(diào)用函數(shù)只可得到一個返回值,而用宏可以設(shè)法得到幾個結(jié)果。例4通過宏展開得到若干個結(jié)果 } }運行情況如下: (5)使用宏次數(shù)多時,宏展開后源程序長,因為每展開一次都使程序增長,而函數(shù)調(diào)用不會使源程序變長。 (6)宏替換不占運行時間,只占編譯時間。而函數(shù)調(diào)用則占運行時間(分配單元、保留現(xiàn)場、值傳如果善于利用宏定義,可以實現(xiàn)程序的簡化,如事先將程序中的“輸出格式”定義好,以減少在輸出語句中每次都要寫出具體的輸出格式的麻煩。例5通過宏展開得到若干個結(jié)果 }運行時輸出結(jié)果:12334所謂“文件包含”處理是指一個源文件可以將另外一個源文件的全部內(nèi)容包含進來。C語言提供其一般形式為:可以不定義字符數(shù)組,而定義一個字符指針。用字符指針指向字符串中的字符。例16定義字符指針 a}對字符串中字符的存取,可以用下標(biāo)方法,也可以用指針方法例17將字符串a(chǎn)復(fù)制為字符串b *(b+i)=′\0′;printf(″\n″);}也可以設(shè)指針變量,用它的值的改變來指向字符串中的不同的字符。例18用指針變量來處理例17問題。 *p2=′\0′;printf(″\n″);}例19用函數(shù)調(diào)用實現(xiàn)字符串的復(fù)制 (1)用字符數(shù)組作參數(shù) } while(from[i]!=′\0′) to[i]=′\0′;}程序運行結(jié)果如下: (2)形參用字符指針變量 acher} *to=**from;*to=′\0′;} {while((*to=*from)?。健鋅0′) } {while((*to++=*from++)?。健鋅0′);} {while(*from?。健鋅0′)tofrom+;*to=′\0′;}它與下面語句等價:while((*to++=*from++)?。健鋅0′);將*from賦給*to,如果賦值后的*to值等于′\0′,則循環(huán)終止(′\0′已賦給*to)或 while((*p2++=*p1++)!=′\0′);}三、對使用字符指針變量和字符數(shù)組的討論雖然用字符數(shù)組和字符指針變量都能實現(xiàn)字符串的存儲和運算,但它們二者之間是有區(qū)別的,不應(yīng)混為一談,主要有以下幾點: (1)字符數(shù)組由若干個元素組成,每個元素中放一個字符,而字符指針變量中存放的是地址(字符串第1個字符的地址),決不是將字符串放到字符指針變量中。 (2)賦值方式。對字符數(shù)組只能對各個元素賦值,不能用以下辦法對字符數(shù)組賦值。而對字符指針變量,可以采用下面方法賦值:char**a;但注意賦給a的不是字符,而是字符串第一個元素的地址。 (3)對字符指針變量賦初值:char**a;而對數(shù)組的初始化:不能等價于 (4)如果定義了一個字符數(shù)組,在編譯時為它分配內(nèi)存單元,它有確定的地址。而定義一個字符指針變量時,給指針變量分配內(nèi)存單元,在其中可以放一個字符變量的地址也就是說,該指針變量可以指向一個字符型數(shù)據(jù),但如果未對它賦予一個地址值,則它并未具體指向一個確定的字符數(shù)據(jù)。而常有人用下面的方法,目的是想輸入一個字符串,雖然一般也能運行,但這種方法是危險的:char**a;應(yīng)當(dāng)這樣: (5)指針變量的值是可以改變的,如:例20改變指針變量的值 charaIloveChina!″;}需要說明,若定義了一個指針變量,并使它指向一個字符串,就可以用下標(biāo)形式引用指針變量所指的字符串中的字符。 chara″IloveChina!″;}考點5指向函數(shù)的指針變量調(diào)用函數(shù)可以用指針變量指向整型變量、字符串、數(shù)組,也可以指向一個函數(shù)。一個函數(shù)在編譯時被分配給一個入口地址。這個函數(shù)的入口地址就稱為函數(shù)的指針。例22求a和b中的大者。先列出按一般方法的程序。 } }將main函數(shù)改寫為 int(*p)();}二、用指向函數(shù)的指針作函數(shù)參數(shù)函數(shù)指針變量常用的用途之一是把指針作為參數(shù)傳遞到其他函數(shù)。前面介紹過,函數(shù)的參數(shù)可以是變量、指向變量的指針變量、數(shù)組名、指向數(shù)組的指針變量等。現(xiàn)在介紹指向函數(shù)的指針也可以作為參數(shù),以實現(xiàn)函數(shù)地址的傳遞,這樣就能夠在被調(diào)用的函數(shù)中使用實參函數(shù)。它的原理可以簡述如下:有一個函數(shù)(假設(shè)函數(shù)名為sub),它有兩個形參(x1和x2),定義x1和x2為指向函數(shù)的指針變量。在調(diào)用函數(shù)sub時,實參為兩個函數(shù)名f1和f2,給形參傳遞的是函數(shù)f1和f2的地址。這樣在函數(shù)sub

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論