郝斌C語(yǔ)言詳細(xì)筆記(附源代碼)_第1頁(yè)
郝斌C語(yǔ)言詳細(xì)筆記(附源代碼)_第2頁(yè)
郝斌C語(yǔ)言詳細(xì)筆記(附源代碼)_第3頁(yè)
郝斌C語(yǔ)言詳細(xì)筆記(附源代碼)_第4頁(yè)
郝斌C語(yǔ)言詳細(xì)筆記(附源代碼)_第5頁(yè)
已閱讀5頁(yè),還剩123頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、郝斌老師的C語(yǔ)言:課堂講解全程動(dòng)手敲代碼,講解細(xì)致,對(duì)于重要知識(shí)點(diǎn)的講解不厭其煩,是一個(gè)難得的C語(yǔ)言入門(mén)教程。在這里對(duì)老師的辛勤付出表示感謝。郝斌c語(yǔ)言視頻教程·概述:課程計(jì)劃為什么學(xué)習(xí)c語(yǔ) 言:Fortran語(yǔ)言主要用于科學(xué)計(jì)算,在第三代語(yǔ)言中,以1980年為分水嶺,分為結(jié)構(gòu)化和面向?qū)ο笳Z(yǔ)言。Basic語(yǔ)言是vb的前生,pascal語(yǔ)言一般是用于教學(xué)。C語(yǔ)言是最重要的,其他的語(yǔ)言一般很少用了。結(jié)構(gòu)化的代表語(yǔ)言是c語(yǔ)言。結(jié)構(gòu)化語(yǔ)言的數(shù)據(jù)和操作是分離的,導(dǎo)致在寫(xiě)大項(xiàng)目的時(shí)候,會(huì)出現(xiàn)各種各樣莫名其妙的問(wèn)題。在面向?qū)ο蟮恼Z(yǔ)言中c+是最復(fù)雜的語(yǔ)言。由于c+語(yǔ)言太復(fù)雜,sun公司對(duì)c+進(jìn)行了改

2、裝,產(chǎn)生了java語(yǔ)言。而c#是由微軟開(kāi)發(fā)的,和java相似,幾乎一模一樣。在高級(jí)語(yǔ)言的執(zhí)行速度上,c是最快的,c+其次,而java和c#是最后的。Java和c#流行,主要的一個(gè)原因是可以跨平臺(tái)。C語(yǔ)言的發(fā)展和過(guò)程:C語(yǔ)言的特點(diǎn):·優(yōu)點(diǎn):代碼量小,速度快,功能強(qiáng)大。·缺點(diǎn):危險(xiǎn)性高,開(kāi)發(fā)周期長(zhǎng),可移植性弱。危險(xiǎn)性高:寫(xiě)同一個(gè)程序,在java中會(huì)報(bào)錯(cuò),而在c中不會(huì)報(bào)錯(cuò),為什么呢,因?yàn)閏認(rèn)為程序你想怎么寫(xiě)就怎么寫(xiě),c語(yǔ)言認(rèn)為你寫(xiě)的程序不是很離譜,他都認(rèn)為你寫(xiě)的這個(gè)程序有特殊的含義??梢灾苯油ㄟ^(guò),而java則不可以。開(kāi)發(fā)周期長(zhǎng):c語(yǔ)言是面向過(guò)程的語(yǔ)言,面向過(guò)程的語(yǔ)言的特點(diǎn)就是在開(kāi)

3、發(fā)大項(xiàng)目的時(shí)候,很容易崩潰,好比蓋大樓,C語(yǔ)言還要造大量的磚塊、鋼筋等結(jié)構(gòu)原材料,而C+ C# JAVA則進(jìn)行了一定的繼承封裝等操作,相當(dāng)于原材料直接給你,你只需要用它蓋樓即可?,F(xiàn)在市場(chǎng)上的語(yǔ)言分三塊C/c+:單純的學(xué)習(xí)c是什么都做不了的。JavaC#可移植性不強(qiáng):這是針對(duì)java來(lái)說(shuō)的,因?yàn)閖ava的可移植性太強(qiáng)了,所以就感覺(jué)說(shuō)c的可移植性不強(qiáng)。金山公司最主要是靠wps辦公軟件來(lái)發(fā)展的。Wps是c語(yǔ)言開(kāi)發(fā)的,其安裝包比Office少了10多倍。三大操作系統(tǒng):windows,unix,linuxWindows內(nèi)核是c語(yǔ)言寫(xiě)的,而外殼是c+寫(xiě)的。Java永遠(yuǎn)不可能寫(xiě)操作系統(tǒng)。因?yàn)閖ava運(yùn)行速度

4、太慢了。而linux和unix都是純c寫(xiě)的。操作系統(tǒng)控制了硬件,如果說(shuō)操作系統(tǒng)的運(yùn)行速度慢,那么當(dāng)我們?cè)谶\(yùn)行軟件的時(shí)候,運(yùn)行速度會(huì)更慢。為什么使用c語(yǔ)言寫(xiě)操作系統(tǒng)呢,首先是因?yàn)閏的運(yùn)行速度快,然后是因?yàn)閏可以直接控制硬件,而其他語(yǔ)言不可以。沒(méi)有指針的語(yǔ)言是不能直接訪問(wèn)硬件的。C語(yǔ)言的應(yīng)用領(lǐng)域:驅(qū)動(dòng)一般是用c和匯編來(lái)寫(xiě)的。數(shù)據(jù)庫(kù)一般是用c和c+來(lái)寫(xiě)的C語(yǔ)言的重要性: 雖然應(yīng)用場(chǎng)合相對(duì)較窄,但貼近系統(tǒng)內(nèi)核,較底層。病毒最基本的是要感染系統(tǒng),數(shù)據(jù)結(jié)構(gòu),c,c+這三門(mén)語(yǔ)言是必須要學(xué)習(xí)的。牛人牛語(yǔ):怎樣學(xué)習(xí)c語(yǔ)言要將編程當(dāng)成一項(xiàng)事業(yè)來(lái)經(jīng)營(yíng),而不是糊口的工具。多思考,多上機(jī)。 不能光看,光聽(tīng),而要排錯(cuò),調(diào)

5、試。在犯錯(cuò)誤中成長(zhǎng)。參考資料王爽寫(xiě)的c+也很不錯(cuò)學(xué)習(xí)的目標(biāo):掌握簡(jiǎn)單的算法-解決問(wèn)題的方法和步驟。熟悉語(yǔ)法規(guī)則。能看懂程序并調(diào)試程序。C語(yǔ)言的關(guān)鍵字: C語(yǔ)言程序的格式:一定要養(yǎng)成良好的習(xí)慣:代碼規(guī)范 邊寫(xiě)邊保存 ,括號(hào)成對(duì)出現(xiàn),應(yīng)用空格VC6.0軟件操作:新建 保存 關(guān)閉(關(guān)閉空間).cpp是原始文件,可單獨(dú)拷貝到其它電腦。第二講:(14)c語(yǔ)言編程必備知識(shí)1. Cpu,內(nèi)存條,硬盤(pán),顯卡,主板,顯示器之間關(guān)系。Cpu不能直接處理硬盤(pán)上的數(shù)據(jù),必須要先調(diào)入內(nèi)存2. Hello word程序是如何運(yùn)行起來(lái)的。3. 什么是數(shù)據(jù)類型數(shù)據(jù)類型-數(shù)據(jù)的分類,對(duì)編程而言,首要考慮問(wèn)題是數(shù)據(jù)的輸入和存儲(chǔ)。

6、可以分為A:基本數(shù)據(jù)類型:整型整型int -4字節(jié) 一字節(jié)byte = 8 位bit短整型short int-2長(zhǎng)整型long int-8浮點(diǎn)型單精度浮點(diǎn)數(shù)float:存儲(chǔ)范圍小 -4雙精度浮點(diǎn)數(shù)double:存儲(chǔ)范圍大-8Float 和 Double 都不能保證將小數(shù)完全準(zhǔn)確保存。字符char:c語(yǔ)言中是沒(méi)有字符串string-1 (區(qū)別于JAVA、C#中有string且C#中 char為2字節(jié))B:復(fù)合類型:就是把基本類型拼湊在一起結(jié)構(gòu)體枚舉 - 實(shí)用共用體基本淘汰4什么是變量變量的本質(zhì)是內(nèi)存中一段存儲(chǔ)空間。Int I; i=5; I 是變量,程序向系統(tǒng)申請(qǐng)了一個(gè)內(nèi)存單元,在程序運(yùn)行中,i

7、的值可以改變,但程序結(jié)束后,其所占的空間不是釋放,而是被系統(tǒng)收回權(quán)限。5 Cpu,內(nèi)存條,vc+6.0,操作系統(tǒng)之間的關(guān)系。6 變量為什么必須初始(即賦值)軟件運(yùn)行與內(nèi)存關(guān)系(垃圾數(shù)據(jù)-9868598658)1. 軟件在運(yùn)行前需要向操作系統(tǒng)申請(qǐng)存儲(chǔ)空間,在內(nèi)存空間足夠空閑時(shí),操作系統(tǒng)將分配一段內(nèi)存空間并將該外存中軟件拷貝一份存入該內(nèi)存空間中,并啟動(dòng)該軟件運(yùn)行。2. 在軟件運(yùn)行期間,該軟件所占內(nèi)存空間不再分配給其他軟件。3. 當(dāng)該軟件運(yùn)行完畢后,操作系統(tǒng)將回收該內(nèi)存空間(注意:操作系統(tǒng)并不清空該內(nèi)存空間遺留下來(lái)的數(shù)據(jù)),以便再次分配給其他軟件使用。操作系統(tǒng)一門(mén)課中系統(tǒng)分配表中會(huì)講到,用1標(biāo)記表示

8、內(nèi)在是被占用的,用0標(biāo)記表示是空閑的。綜上所述,一個(gè)軟件所分配到的空間中極可能存在著以前其他軟件使用過(guò)后的殘留數(shù)據(jù),這些數(shù)據(jù)被稱之為垃圾數(shù)據(jù),所以通常情況下我們?yōu)橐粋€(gè)變量,為一個(gè)數(shù)組,分配好存儲(chǔ)空間之前都要對(duì)該內(nèi)存空間初始化。7 如何定義變量數(shù)據(jù)類型 變量名稱 = 賦予的值;等價(jià)于數(shù)據(jù)類型 變量名;變量名 = 要賦予的值;舉例子:int i = 3; 等價(jià)于 int i; i = 3;Int i,j;等價(jià)于 int i;int j;Int i,j=3 等價(jià)于 int i; int j;j=3;Int I =3, j = 5;等價(jià)于 int i; int j; I = 3;j = 5;8 什么是

9、進(jìn)制 逢幾進(jìn)一我們規(guī)定八進(jìn)制前面加0(零),十六進(jìn)制前面加0x。常用計(jì)數(shù)制對(duì)照表:Printf的基本用法:9 常量在c中是如何表示的當(dāng)個(gè)字符使用單引號(hào)括起來(lái),多個(gè)字符串使用雙引號(hào)括起來(lái)(指針、數(shù)組)。在c中,默認(rèn)是double類型的。在后面加F表示當(dāng)做float來(lái)處理,否則會(huì)有警告提示 -丟失部分字節(jié)。10 常量以什么樣的二進(jìn)制代碼存儲(chǔ)在計(jì)算機(jī)中?編碼:整數(shù)是以補(bǔ)碼的形式轉(zhuǎn)換為二進(jìn)制代碼存儲(chǔ)在計(jì)算機(jī)浮點(diǎn)數(shù)是以ieee754標(biāo)準(zhǔn)轉(zhuǎn)換為二進(jìn)制代碼存儲(chǔ)字符本質(zhì)實(shí)際是與整數(shù)的存儲(chǔ)方式相同,ASII碼標(biāo)準(zhǔn)。第三次課:代碼規(guī)范化·可以參考林銳高質(zhì)量c/c+編程·代碼的規(guī)范化非常的重要,

10、是學(xué)習(xí)一門(mén)編程語(yǔ)言的基礎(chǔ),代碼可以允許錯(cuò)誤,但不能 不規(guī)范。例如:成對(duì)敲括號(hào) ()加空格于 運(yùn)算符和數(shù)字之間 I = 1 + 2;加縮進(jìn) 分清上下級(jí)地位。換行-進(jìn)行功能區(qū)域分隔 or 括號(hào)單獨(dú)成一行。·代碼規(guī)范化的好處1:整齊,別人和自己都容易看懂。2:代碼規(guī)范了,代碼不容易出錯(cuò)。3:一般的程序可以分為三塊:a: 定義變量b:對(duì)變量進(jìn)行操作c: 輸出值什么是字節(jié)·存儲(chǔ)數(shù)據(jù)的單位,并且是硬件所能訪問(wèn)的最小單位。內(nèi)存中存儲(chǔ)的最小單位是位bit(0或1),但是硬件控制的時(shí)候不能精確到位,只能精確到字節(jié)(8位),是通過(guò)地址總線來(lái)控制的,而精確到位是通過(guò)軟件來(lái)控制的,叫做位運(yùn)算符來(lái)精

11、確到位的。1字節(jié) = 8 位 1K = 1024 字節(jié) 1M = 1024 K 1G =1024 M 1T = 1024 G 2G的內(nèi)存條的總空間:2 *1024 * 1024 *1024 * 8 =4*1032不同類型數(shù)據(jù)之間相互賦值的問(wèn)題不同數(shù)據(jù)類型之間最好不要相互轉(zhuǎn)換。如果需要明白這個(gè)知識(shí)點(diǎn),那么需要明白補(bǔ)碼。什么是ASCII碼以char定義變量的時(shí)候,只能使用單引號(hào)括起一個(gè)字符才是正確的。在上圖中注釋的最后一樣是重復(fù)定義了ch的值,是錯(cuò)誤的,而下面的ch = c是指把c賦值給ch,是正確的。上圖中輸出的值是98(將字符以整數(shù)%d的形式輸出)Ascll碼規(guī)定了ch是以哪個(gè)值去保存,asc

12、ii碼不是一個(gè)值,而是一種規(guī)定,規(guī)定了不同的字符是以哪個(gè)整數(shù)值去表示。其它規(guī)定還有GB 2312 UTF-8等。字符本質(zhì)上與整數(shù)的存儲(chǔ)方式相同【字符的存儲(chǔ)】基本的輸入和輸出函數(shù)的用法:第三次課Printf()將變量的內(nèi)容輸出到顯示器上。四種用法輸什么是輸出控制符,什么是非輸出控制符輸出控制符包含如下:Printf為什么需要輸出控制符:·01組成的代碼可以表示數(shù)據(jù)也可以表示指令。必須要有輸出控制符告訴他怎么去解讀。·如果01組成的代碼表示的是數(shù)據(jù)的話,那么同樣的01代碼組合以不同的格式輸出就會(huì)有不同的輸出結(jié)果,所以必須要有輸出控制符。在上圖中,int x =47,如果前面加0

13、(零)048表示的是八進(jìn)制,如果前面加0x(零x)0X47則表示的是十六進(jìn)制,而在輸出的時(shí)候,則是o(字母o)表示八進(jìn)制,ox(字母o,x)表示十六進(jìn)制。非輸出控制符:非輸出控制符在輸出的時(shí)候會(huì)原樣輸出。Scanf()通過(guò)鍵盤(pán)將數(shù)據(jù)輸入到變量中有兩種用法:示例:非輸入控制符:在輸入的時(shí)候也會(huì)原樣輸入。但是強(qiáng)烈建議:在使用scanf的時(shí)候,不使用非輸入控制符。給多個(gè)變量賦值:需要記住,非控制符需要原樣輸入。如何使用scanf編寫(xiě)出高質(zhì)量代碼運(yùn)算符:算術(shù)運(yùn)算符:加(+),減()乘(*)除(/)取余(%)關(guān)系運(yùn)算符:>, >=, <, <=, !=,邏輯運(yùn)算符:?。ǚ牵?,&a

14、mp;&(且),|(或)賦值運(yùn)算符:=, +=,*=, /=例如:a+=3是等價(jià)于a=a+3,a/=3等價(jià)于a=a/3其優(yōu)先級(jí)別是算術(shù)>關(guān)系>邏輯>賦值。取余的結(jié)果的正負(fù)只和被除數(shù)有關(guān)。第四節(jié)流程控制(第一個(gè)重點(diǎn)):1 什么是流程控制程序代碼執(zhí)行的順序。2 流程控制的分類順序執(zhí)行選擇執(zhí)行定義:某些代碼可能執(zhí)行,可能不執(zhí)行,有選擇的執(zhí)行某些代碼。分類:ifIf最簡(jiǎn)單的用法:如果想控制多個(gè)語(yǔ)句的執(zhí)行或者不執(zhí)行,那么需要使用括起來(lái)。3.ifelse的用法:ifelse ifelse的用法:C錯(cuò)誤的ifelse ifelse語(yǔ)句:在上圖中,當(dāng)執(zhí)行到哈哈那句時(shí),下面的else將

15、會(huì)被算作另外一個(gè)語(yǔ)句來(lái)執(zhí)行,而在我們的c語(yǔ)言中,沒(méi)有以else開(kāi)頭的語(yǔ)句。所以會(huì)出錯(cuò)。If 實(shí)例:If常見(jiàn)的問(wèn)題:變量的替換:求三個(gè)數(shù)字的大?。篊語(yǔ)言常見(jiàn)誤區(qū):紙老虎素?cái)?shù):只能被1和自己整除的數(shù),如1,5,9等。回文數(shù):正著寫(xiě)和倒著寫(xiě)一樣的數(shù)。如1221,121,等編程實(shí)現(xiàn)求一個(gè)十進(jìn)制數(shù)字的二進(jìn)制形式:求一個(gè)數(shù)字的每位是奇數(shù)的數(shù)字取出來(lái)組合形成的新數(shù)字。求一個(gè)數(shù)字到過(guò)來(lái)的數(shù)字。1:如果不懂,那么就看答案??炊鸢冈谇?。沒(méi)錯(cuò)誤了,在嘗試改。如何看懂一個(gè)程序:1. 流程:2. 每個(gè)語(yǔ)句的功能:3. 試數(shù):對(duì)一些小算法的程序:1. 嘗試自己編程結(jié)局。2. 解決不了,看答案。3. 關(guān)鍵是把答案看懂。4

16、. 看懂之后嘗試自己修改程序,且知道修改之后程序的不同輸出結(jié)果的含義。5. 照著答案去敲6. 調(diào)試錯(cuò)誤7. 不看答案,自己獨(dú)立把程序編出8. 如果程序?qū)嵲谑菑氐谉o(wú)法了解,就把他背會(huì)。 空語(yǔ)句的問(wèn)題: 在上圖中,最終的結(jié)果會(huì)是AAAA,BBBB,程序也不會(huì)報(bào)錯(cuò),為什么呢,因?yàn)樵诔绦驁?zhí)行的時(shí)候,會(huì)在;哪里認(rèn)為是一個(gè)空語(yǔ)句。也就是說(shuō),如果if成立,那么執(zhí)行空語(yǔ)句。If常見(jiàn)錯(cuò)誤解析(重點(diǎn))上面這個(gè)程序是錯(cuò)誤的,為什么呢,在該程序中,總的有4個(gè)語(yǔ)句,而在以else開(kāi)頭的那個(gè)語(yǔ)句中是有錯(cuò)誤的,因?yàn)樵赾語(yǔ)言中是沒(méi)有以else開(kāi)頭的這種語(yǔ)法。在上面這個(gè)程序中,最終的值是AAAA,雖說(shuō)后面的3>1也滿足條

17、件,但是當(dāng)3>2滿足條件后,該if語(yǔ)句就會(huì)終止,后面的語(yǔ)句是不會(huì)在執(zhí)行的。 既然7行要寫(xiě)表達(dá)式,就要寫(xiě)if。循環(huán)的定義、分類。定義:某些代碼會(huì)被重復(fù)執(zhí)行。分類:for while dowhile 在上圖中,先執(zhí)行1,在執(zhí)行2,2如果成立,標(biāo)志著循環(huán)成立,那么在執(zhí)行4,最后在執(zhí)行3,3執(zhí)行完后代表一次循環(huán)完成,然后在執(zhí)行2.以此類推。1永遠(yuǎn)只執(zhí)行一次。+I 等價(jià)于 i+1求1-10的所有奇數(shù)的和:求1-12之間的所有能被3整除的數(shù)字之和: For所控制的語(yǔ)句:在上圖中,for默認(rèn)只能控制一個(gè)語(yǔ)句,但是如果要控制多個(gè)語(yǔ)句時(shí)候,那么需要使用把語(yǔ)句括起來(lái)。求1+1/2+1/3.1/100的和在上

18、圖中,重點(diǎn)是強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換也就是(float)(i)那句:如果把print那句換為下面這句會(huì)怎么樣呢:也是錯(cuò)的,為什么呢,因?yàn)閕是整型,1也是整型,所以不管你怎么轉(zhuǎn)換也是整型啊,如果想要這樣寫(xiě)的話,那么我們需要把1改成1.0也可以的。也就是:試數(shù)詳細(xì)步驟舉例:浮點(diǎn)數(shù)存?。呵?-100之間所有奇數(shù)的和:求1-100之間的奇數(shù)的個(gè)數(shù): 求1-100之間奇數(shù)的平均值: 求1-100之間的奇數(shù)之和,在求1-100之間的偶數(shù)之和:多個(gè)for循環(huán)的嵌套使用:整體是兩個(gè)語(yǔ)句。上圖中,先執(zhí)行1,在執(zhí)行2,如果2成立,執(zhí)行4,在執(zhí)行5,如果5成立執(zhí)行A,在執(zhí)行6,在執(zhí)行5,如果5不成立,意味著里面的循環(huán)結(jié)束,

19、然后執(zhí)行3,在執(zhí)行2,如果2成立又執(zhí)行4,在執(zhí)行5,如果5成立在執(zhí)行6,在執(zhí)行5,如果5不成立,在執(zhí)行3,在執(zhí)行2,如果2不成立,意味著本次循環(huán)結(jié)束,在執(zhí)行B,在上圖中,需要注意的是,如果2成立的話,那么每次4都需要執(zhí)行。進(jìn)制之間的轉(zhuǎn)換:如234為5進(jìn)制,那么轉(zhuǎn)換成10進(jìn)制是多少:2x5x5+3x5+4的值就是轉(zhuǎn)換成的10進(jìn)制。234e是16進(jìn)制,轉(zhuǎn)換成2進(jìn)制是多少:2x16x16x16+3x16x16+4x16+12的值就是轉(zhuǎn)換成10進(jìn)制的值。注意上面的規(guī)律。那么把十進(jìn)制轉(zhuǎn)換成r進(jìn)制呢,其實(shí)很簡(jiǎn)單,就是把10進(jìn)制數(shù)除以r,直到商是0的時(shí)候。然后取余數(shù),余數(shù)倒序排列: 瑣碎的運(yùn)算符:自增:自減

20、:和自增一樣。三目運(yùn)算符:最終的輸出結(jié)果是1.逗號(hào)表達(dá)式:最終結(jié)果是6.上圖中,逗號(hào)是個(gè)順序點(diǎn),即所有的副作用必須在下個(gè)語(yǔ)句前生效,其最后結(jié)果為1,j+2只是產(chǎn)生臨時(shí)值,并沒(méi)有把j+2的值賦個(gè)j。如果寫(xiě)成j+=2,那最后的值則變?yōu)?.For的嵌套使用舉例:上例中輸出的結(jié)果是9個(gè)哈哈,1個(gè)嘻嘻。在上圖中,整個(gè)程序分成3個(gè)語(yǔ)句,輸出的結(jié)果是3個(gè)嘿嘿,3個(gè)哈哈,1個(gè)嘻嘻。其結(jié)果是:While(先付錢后吃飯)1:執(zhí)行的順序:2:與for的相互比較:用for來(lái)求1-100之和:用while實(shí)現(xiàn)1-100之和。只需要把for語(yǔ)句替換為:For和while是可以相互轉(zhuǎn)換的,可以用下面的表達(dá)式來(lái)表示:Whil

21、e和for在邏輯上完全等價(jià),但是for在邏輯上更強(qiáng)。更容易理解,更不容易出錯(cuò)。推薦多使用for。3:while舉例:試數(shù):通過(guò)上面的試數(shù),應(yīng)該能很快的理解回文數(shù)的算法。4:什么時(shí)候使用while,什么時(shí)候使用for:沒(méi)法說(shuō),用多了就自然而然知道了Dowhile(先吃飯后付錢)一元二次方程:Switch的用法:電梯程序:Case是程序的入口,當(dāng)進(jìn)入程序后,程序會(huì)從上往下執(zhí)行,如果有break,那么會(huì)中斷程序,如果沒(méi)有,那么會(huì)一直執(zhí)行。Break的用法:在多層循環(huán)中,Break只能終止他最近的循環(huán)。在多層switch中,break也是只能終止距離他最近的switch。Break只能用于循環(huán)和swi

22、tch,不能用于if。如果用于if,必須要當(dāng)循環(huán)中嵌套if的時(shí)候。Continue的用法:上圖中,如果執(zhí)行continue,那么C,D將不會(huì)被執(zhí)行,會(huì)執(zhí)行3.在上圖中,如果執(zhí)行了continue,那么后面的C,D將不再執(zhí)行,而會(huì)去執(zhí)行表達(dá)式。數(shù)組:-非重點(diǎn) 數(shù)組的使用:為什么需要數(shù)組1:為了解決大量同類型數(shù)據(jù)的存儲(chǔ)和使用問(wèn)題。2:用數(shù)組可以模擬現(xiàn)實(shí)世界。Int a25:一維數(shù)組,可以當(dāng)做一個(gè)線性結(jié)構(gòu)。Int a86:可以當(dāng)做一個(gè)平面,意思是8行6列。有48個(gè)元素。Int a345:可以當(dāng)做一個(gè)三維 立體。Int a3456:可以當(dāng)做一個(gè)四維空間。數(shù)組的分類一維數(shù)組怎樣定義一維數(shù)組:·

23、為n個(gè)變量分配存儲(chǔ)空間:數(shù)組內(nèi)存空間是連續(xù)的。·所有的變量類型必須相同:數(shù)組不可能第一個(gè)元素是整形,第二個(gè)元素是浮點(diǎn)型。·所有變量所占用的字節(jié)必須相等。 例子:int 5數(shù)組不是學(xué)習(xí)重點(diǎn)的原因?數(shù)組一旦定義,其長(zhǎng)度是死的。有關(guān)一維數(shù)組的操作 -都需要自己另外編程序?qū)崿F(xiàn)而我們通常用第三方軟件(工具)如數(shù)據(jù)庫(kù)等方便直接地實(shí)現(xiàn)。對(duì)數(shù)組的操作:初始化 賦值 排序 求最大/小值 倒置 查找 插入 刪除·初始化:上圖中a5前面如果沒(méi)有加上數(shù)據(jù)類型,那么這里的a5不是指一個(gè)數(shù)組,其中的5只的是下標(biāo)。上圖中,數(shù)組的5個(gè)元素不是用a來(lái)代表的,是用a0,a1a4來(lái)代表的,所以說(shuō)數(shù)組名

24、a代表的不是數(shù)組的5個(gè)元素,數(shù)組名代表的是數(shù)組的第一個(gè)元素的地址。·賦值 把一個(gè)數(shù)組元素給全部倒過(guò)來(lái):·排序 ·求最大/小值· 倒置· 查找· 插入· 刪除 二維數(shù)組:二維數(shù)組的初始化: 輸出二維數(shù)組內(nèi)容:多維數(shù)組:是否存在多維數(shù)組:不存在因?yàn)閮?nèi)存是線性一維的,在內(nèi)存中是不分行不分列的。N維數(shù)組可以當(dāng)做每個(gè)元素是n-1維數(shù)組的 一維數(shù)組。函數(shù)(第二個(gè)重點(diǎn)):為什么需要函數(shù):·避免了重復(fù)性操作。·有利于程序的模塊化。(自上而下,逐步細(xì)化,大問(wèn)題分解成小問(wèn)題)用它作為參照,可以對(duì)比 JAVA 和C#面向?qū)ο蟮?/p>

25、思想。C語(yǔ)言基本單位是函數(shù),C#、C+和JAVA基本單位是類。什么叫做函數(shù)·邏輯上:能夠完成特定功能的獨(dú)立的代碼塊。 物理上:能夠接收數(shù)據(jù)【也可以不接收數(shù)據(jù)】,能夠?qū)邮盏臄?shù)據(jù)進(jìn)行處理【也可以不對(duì)數(shù)據(jù)進(jìn)行處理】,能夠?qū)?shù)據(jù)處理的結(jié)果返【也可以沒(méi)有返回值】。·總結(jié):函數(shù)是個(gè)工具,他是為了解決大量類似問(wèn)題而設(shè)計(jì)的,函數(shù)可以當(dāng)做黑匣子(內(nèi)部原理不用管)。如何定義函數(shù)·函數(shù)的返回值,函數(shù)的名字(函數(shù)的形參列表)函數(shù)的執(zhí)行體·函數(shù)定義的本質(zhì):詳細(xì)描述函數(shù)之所以能夠?qū)崿F(xiàn)某個(gè)特定功能的具體方法。函數(shù)中的變量叫做形參;數(shù)組中的變量叫元素。一旦函數(shù)執(zhí)行完畢,其內(nèi)部的形參所

26、占空間就被收回。·return表達(dá)式的含義:Return是終止被調(diào)函數(shù),向主調(diào)函數(shù)返回表達(dá)式的值,如果表達(dá)式為空,則只終止函數(shù),不向被主函數(shù)返回任何值。Break是用來(lái)終止(就近的)循環(huán)和switch語(yǔ)句。而return是用來(lái)終止被調(diào)函數(shù)的。·函數(shù)返回值的類型,也稱為函數(shù)的類型,因?yàn)槿绻瘮?shù)名前的返回值類型和函數(shù)執(zhí)行體中的return表達(dá)式中表達(dá)式的類型不同的話,則最終函數(shù)返回值的類型以函數(shù)名前的返回值類型為準(zhǔn)。例:在上圖中,函數(shù)的返回值以函數(shù)前的數(shù)值類型為準(zhǔn)。函數(shù)的分類·有參函數(shù)和無(wú)參函數(shù)。·有返回值和無(wú)返回值。·庫(kù)函數(shù)和用戶自定義函數(shù)。&#

27、183;普通函數(shù)和主函數(shù)(main函數(shù))1:一個(gè)程序有且只有一個(gè)主函數(shù)。2:主函數(shù)可以調(diào)用普通函數(shù),普通不能調(diào)用主函數(shù)。3:普通函數(shù)可以相互調(diào)用。4:主函數(shù)是程序的入口,也是函數(shù)的出口。5:值傳遞函數(shù)和地址傳遞函數(shù)。 判斷一個(gè)數(shù)是否是素?cái)?shù):使用函數(shù)判斷一個(gè)數(shù)是否是素?cái)?shù):函數(shù)和程序的調(diào)用應(yīng)該注意的地方:函數(shù)的聲明:當(dāng)函數(shù)沒(méi)有返回值時(shí),那么規(guī)范的寫(xiě)法是要在函數(shù)中寫(xiě)明void的。在上圖中,第一個(gè)void表示沒(méi)有返回值,而第二個(gè)void表示不接收形參,也就是函數(shù)不接收數(shù)據(jù)。如果想把函數(shù)寫(xiě)在程序的后面,那么需要寫(xiě)函數(shù)聲明:函數(shù)聲明的含義是告訴編譯器f()是個(gè)函數(shù)名。如果不加函數(shù)聲明,那么編譯器在編譯到f

28、的時(shí)候,不知道f是個(gè)什么,如果加了函數(shù)聲明,那么編譯器編譯到f的時(shí)候,就知道f是個(gè)函數(shù)。·需要注意的是,調(diào)用語(yǔ)句需要放在定義語(yǔ)句的后面,也就是說(shuō),定義函數(shù)的語(yǔ)句要放在調(diào)用語(yǔ)句的前面。如果函數(shù)調(diào)用寫(xiě)在了函數(shù)定義的前面,則必須加函數(shù)前置聲明,函數(shù)前置聲明的作用是:1:告訴編譯器即將可能出現(xiàn)的若干個(gè)字母代表的是一個(gè)函數(shù)?!按蛘泻簟?:告訴編譯器即將可能出現(xiàn)的若干個(gè)字母所代表的函數(shù)的形參和返回值的具體情況。3:函數(shù)聲明必須是一個(gè)語(yǔ)句,也就是在函數(shù)聲明后需加分號(hào)。4:對(duì)庫(kù)函數(shù)的聲明也就是系統(tǒng)函數(shù)。是通過(guò)#include<庫(kù)函數(shù)所在的文件的名字.h>來(lái)實(shí)現(xiàn)的。如stdio.h形參和實(shí)

29、參要求:1:形參和實(shí)參個(gè)數(shù)是一一對(duì)應(yīng)的。2:形參和實(shí)參的位置也是一一對(duì)應(yīng)的。3:形參和實(shí)參的數(shù)據(jù)類型需要相互兼容。 ·如何在軟件開(kāi)發(fā)中合理的設(shè)計(jì)函數(shù)來(lái)解決實(shí)際問(wèn)題。 求1到某個(gè)數(shù)字之間的數(shù)是否是素?cái)?shù),并將他輸出:合理設(shè)計(jì)函數(shù)1合理設(shè)計(jì)函數(shù)2:合理設(shè)計(jì)函數(shù)3:合理的設(shè)計(jì)函數(shù)4:合理設(shè)計(jì)函數(shù)5:常用的系統(tǒng)函數(shù)和如何通過(guò)書(shū)籍來(lái)學(xué)習(xí)函數(shù): Turboc2.0實(shí)用大全機(jī)械工業(yè)出版社遞歸:(略)棧:相當(dāng)于一個(gè)杯子(容器) 變量的作用域和存儲(chǔ)方式: 全局變量和局部變量:局部變量:局部變量的使用范圍只能在本函數(shù)內(nèi)部使用。全部變量:全局變量和局部變量命名沖突的問(wèn)題:在同一個(gè)范圍之內(nèi)不能定義兩個(gè)一樣的局

30、部變量:在一個(gè)函數(shù)內(nèi)部,如果定義的局部函數(shù)的名字和全局變量名一樣時(shí),局部變量會(huì)屏蔽掉全局變量:上例中最終的輸出結(jié)果是8,因?yàn)榫植孔兞堪讶肿兞拷o屏蔽掉了。指針:(C語(yǔ)言的靈魂)內(nèi)存的存儲(chǔ)是以一個(gè)字節(jié)為一個(gè)編號(hào),也就是8位合在一起給一個(gè)編號(hào),不是0,1就給編號(hào)。內(nèi)存分為很多個(gè)單元,每個(gè)單元就會(huì)分配一個(gè)編號(hào)。地址:內(nèi)存單元的一個(gè)編號(hào)。而指針和地址一個(gè)概念的。也就是說(shuō)指針就是地址。普通變量:只能存放一個(gè)值。指針變量:同樣是一個(gè)變量,但是指針變量存放其他變量的地址。*p代表的是p所指向的那個(gè)變量。在上圖中*p和i是同一個(gè)東西,但是*p和p不是同一個(gè)東西。在上圖中,int * p是一個(gè)聲明,開(kāi)頭的int

31、 * 是他的數(shù)據(jù)類型。P是變量的名字。不能理解我定義了一個(gè)整形變量,這個(gè)整形變量的名字叫做*p。所謂int *類型,實(shí)際就是存放int 變量地址的類型。*p代表的是以p的內(nèi)容為地址的變量。解析:p的內(nèi)容是一個(gè)地址,在上圖中,p的內(nèi)容就是i的地址,*p其指向的變量當(dāng)然就是i變量了。指針和指針變量:指針就是地址,地址就是指針。地址就是內(nèi)存單元的編號(hào)。指針變量:存放地址的變量。而指針只是一個(gè)值,這個(gè)值是內(nèi)存單元的一個(gè)編號(hào)。指針變量才是一個(gè)變量,他里面才可以存放數(shù)據(jù)。指針和指針變量是兩個(gè)不同的概念,但是需要注意的是,通常我們?cè)跀⑹鰰r(shí)會(huì)把指針變量簡(jiǎn)稱為指針,實(shí)際他們含義并不一樣。指針的重要性:指針的分類

32、:指針的定義:·地址:內(nèi)存單元的編號(hào),是一個(gè)從0開(kāi)始的非負(fù)整數(shù)。范圍:cpu對(duì)內(nèi)存是通過(guò)控制、數(shù)據(jù)、地址三條總線來(lái)進(jìn)行控制的??刂疲篶up會(huì)先把內(nèi)存中的數(shù)據(jù)讀入,進(jìn)行處理后,在返回給內(nèi)存,然后內(nèi)存在把數(shù)據(jù)寫(xiě)入硬盤(pán)。數(shù)據(jù):用于數(shù)據(jù)的傳輸,不管是把內(nèi)存中的數(shù)據(jù)發(fā)送給cpu,還是把cpu的數(shù)據(jù)寫(xiě)如內(nèi)存條,都是由數(shù)據(jù)線來(lái)完成的,但是數(shù)據(jù)傳輸?shù)姆较騽t是由控制線來(lái)控制的。地址:地址線則是確定數(shù)據(jù)要寫(xiě)入內(nèi)存中的那個(gè)單元。所謂的一個(gè)單元就是一個(gè)字節(jié)。一條地址總線能控制2的1次方,一般的機(jī)器有32個(gè)地址線,最終能夠控制2的32個(gè)單元,而每個(gè)單元是八位,而最終我們的內(nèi)存能夠存儲(chǔ)2的32次方*8位。則換算

33、為G的話,最終大小為4G.那么地址總線的范圍則是4G大。指針:指針就是地址,地址就是指針。 指針變量就是存放內(nèi)存單元編號(hào)的變量。 指針變量和指針是兩個(gè)不同的概念。 指針的本質(zhì)就是一個(gè)操作受限的非負(fù)整數(shù)。指針不能進(jìn)行算術(shù)運(yùn)算-相加 乘 除。但是能相減。如果兩個(gè)指針變量指向的是同一塊連續(xù)空間的不同存儲(chǔ)單元,則這兩個(gè)指針變量才可以相減。類似于同一個(gè)小區(qū)同一樓層六牌號(hào)相減表示兩房間隔。這時(shí)才有現(xiàn)實(shí)意義?;绢愋偷闹羔槪篒nt *p:p只能存放int類型的地址。P = & i:把i的地址賦給p。然后p就指向了i,*p就等于i。其實(shí)就是1:該語(yǔ)句保存了i的地址。2:p保存了i的地址,所以p指向i。

34、3:p既然指向i,*p就是i。*p:表示以p的內(nèi)容為地址的變量。*p:p是有指向的,p里面是個(gè)垃圾值,*p則是說(shuō)以p的內(nèi)容為地址的變量。因?yàn)椴恢纏的值是多少,所以不知道*p到底代表的是那個(gè)變量。而*p = i,i=5,最終的結(jié)果就是把5賦給了一個(gè)所不知道的單元。 上圖中,第一個(gè)error是數(shù)據(jù)類型不符合,不能相互轉(zhuǎn)換。*q代表的是整形,因?yàn)?q代表的是以q的地址為內(nèi)容的變量。而p是地址(int *)類型。第二個(gè)error同樣有錯(cuò),因?yàn)閝沒(méi)有賦值。經(jīng)典指針程序-互換兩個(gè)數(shù)字: 1:先用函數(shù)來(lái)互換:最終的輸出結(jié)果沒(méi)有互換,因?yàn)楹瘮?shù)的a,b已經(jīng)執(zhí)行完成,分配給內(nèi)存的空間已經(jīng)釋放了,所以最終a,b的

35、值還是主函數(shù)a,b的值?;Q的是形參的a,b。和主函數(shù)沒(méi)有關(guān)系。在上圖中,輸出的值也是沒(méi)有互換的,輸出的同樣是3,5,需要注意的是,互換的只是p、q的內(nèi)容,局部函數(shù)變化了,但是主函數(shù)是沒(méi)有變化的。最終正確的程序:*號(hào)的三種含義:1:乘法2:定義指針變量。Int * p,定義了一個(gè)名字叫p的變量,int *表示p只能存放int變量的地址。3:指針運(yùn)算符。該運(yùn)算符是放在已經(jīng)定義好的指針變量的前面。如果p是一個(gè)已經(jīng)定義好的指針變量,則*P表示以p的內(nèi)容為地址的變量。 注意理解形參,實(shí)參,和局部變量的關(guān)系。指針可以是函數(shù)返回一個(gè)以上的值:不使用指針的話,只能使用用return來(lái)返回一個(gè)值。如何通過(guò)被調(diào)

36、函數(shù)修改主調(diào)函數(shù)普通變量的值指針和數(shù)組:指針和一維數(shù)組:(數(shù)組名 下標(biāo)與指針關(guān)系 指針變量的運(yùn)算)·一維數(shù)組名:一維數(shù)組名是個(gè)指針常量,他存放的是一維數(shù)組第一個(gè)元素的地址。常量是不能被改變的,也就是說(shuō),一維數(shù)組名是不能被改變的。數(shù)組名a存放的是一維數(shù)組第一個(gè)元素的地址,也就是a = &a。printf(“%#Xn”,&a0); = printf(“%#Xn”,a);指針和二維數(shù)組:下標(biāo)和指針的關(guān)系:·如果p是個(gè)指針變量,則pi永遠(yuǎn)等價(jià)于*(p+i)確定一個(gè)一維數(shù)組需要幾個(gè)參數(shù),【如果一個(gè)函數(shù)要處理一個(gè)一維數(shù)組,則形參需要接收該數(shù)組的哪些信息?!看_定一個(gè)一維數(shù)

37、組需要兩個(gè)參數(shù),1:數(shù)組名,從數(shù)組的名稱就可以知道數(shù)組的第一個(gè)值,因?yàn)橐痪S數(shù)組的名稱就是數(shù)組的第一個(gè)元素的地址。2:是數(shù)組的個(gè)數(shù)。來(lái)計(jì)算該數(shù)組有多少個(gè)值。區(qū)別于 字符串(只需要一個(gè)參數(shù)首地址)因?yàn)樽址J(rèn)其后面都有一個(gè)“/0”作為結(jié)束標(biāo)志。而數(shù)組并沒(méi)有相關(guān)約定。在上圖中,a是個(gè)指針變量,所以上面局部函數(shù)f的pArr則要定義成指針函數(shù)才可以,而len則是int類型。代表接收的是整型的數(shù)字。 在上圖中因?yàn)閿?shù)組a的名稱代表的是a的第一個(gè)元素的地址,所以在函數(shù)f中所定義的指針變量pArr和a是相同的,因?yàn)閍也是指針類型。也就是說(shuō)pArr=a=a0,pArr1=a1=*(pArr+1)=*(a+1),

38、pArr2=a2=*(pArr+2) =*(a+2).所以在f函數(shù)中pArr3=a3,所以第二個(gè)printf輸出的結(jié)果是88.總結(jié):pArri = ai = *(pArr+i) = *(a+i)在沒(méi)有學(xué)習(xí)指針時(shí),可將a3認(rèn)為是數(shù)組中第4個(gè)元素,但現(xiàn)在應(yīng)該對(duì)其內(nèi)部原理有更深刻認(rèn)識(shí)。這里下標(biāo)也當(dāng)成指針了,從首元素開(kāi)始向后移動(dòng)3個(gè),即指向第4個(gè)元素。在上圖中因?yàn)閿?shù)組a的名稱代表的是a的第一個(gè)元素的地址,所以在函數(shù)f中所定義的指針變量pArr和a是相同的,因?yàn)閍也是指針變量類型。也就是說(shuō)pArr=a=a0,pArr1=a1=*(pArr+1)=*(a+1),pArr2=a2=*(pArr+2) =*(

39、a+2).通過(guò)上圖,我們知道,我們?cè)趂函數(shù)中修改數(shù)組的值,相當(dāng)于修改主函數(shù)中相對(duì)應(yīng)的值。何謂變量地址 / 一個(gè)指針占幾個(gè)字節(jié)Sizeof(變量名/數(shù)據(jù)類型) 其返回值就是該變量或數(shù)據(jù)類型所占字節(jié)數(shù)。一個(gè)指針變量無(wú)論其指向變量占幾個(gè)字節(jié),其本身所占大小都是4字節(jié)。*p具體指向幾個(gè)字節(jié),要靠前面類型確定,如果為int則為4字節(jié),如果double則占8字節(jié)。CPU 與 內(nèi)存 交互時(shí) 有32根線,每根線只能是1或0兩個(gè)狀態(tài),所有總共有232個(gè)狀態(tài)。1 個(gè)狀態(tài) 對(duì)應(yīng) 一個(gè)單元。如全為0 全為1 等。內(nèi)存中第一個(gè)單元,即32根線狀態(tài)全為0。0000 0000 0000 0000 0000 0000 000

40、0 0000 其大小為4字節(jié)所有每個(gè)地址(硬件所能訪問(wèn))的用4個(gè)字節(jié)保存(而不是一 位bit)一個(gè)變量的地址用該變量首字節(jié)的地址表示。這也就是為什么指針變量始終只占4字節(jié)的原因。接下來(lái)是:138課 動(dòng)態(tài)分配內(nèi)存(很重要)專題:138講動(dòng)態(tài)內(nèi)存分配 (所有高級(jí)語(yǔ)言,沒(méi)有C里深刻,對(duì)JAVA、C#理解有益)傳統(tǒng)數(shù)組的缺點(diǎn):1.數(shù)組長(zhǎng)度必須事先指定,而且只能是常整數(shù),不能是變量例子int a5; /必須事先指定,而且只能是常整數(shù) int len = 5; int alen;/error2.傳統(tǒng)形式定義的數(shù)組,該數(shù)組的內(nèi)存程序員無(wú)法手動(dòng)釋放數(shù)組一旦定義,系統(tǒng)為數(shù)組分配的內(nèi)存空間就會(huì)一直存在,除非數(shù)組所

41、在的函數(shù)運(yùn)行終止。在一個(gè)函數(shù)運(yùn)行期間,系統(tǒng)為該函數(shù)中的數(shù)組分配的空間會(huì)一直存在。直到該函數(shù)運(yùn)行完畢時(shí),數(shù)組的空間才會(huì)被系統(tǒng)自動(dòng)釋放(不是清零)。例子:void f(void) int a5=1,2,3,4,5;./數(shù)組a 占20個(gè)字節(jié)的內(nèi)存空間,程序員無(wú)法手動(dòng)編程釋放它,數(shù)組a只能在f()函數(shù)結(jié)束被系統(tǒng)釋放3. 數(shù)組的長(zhǎng)度一旦定義,數(shù)組長(zhǎng)度就不能再更改。數(shù)組的長(zhǎng)度不能在函數(shù)運(yùn)行的過(guò)程中動(dòng)態(tài)的擴(kuò)充或縮小4. 傳統(tǒng)方式定義的數(shù)組不能跨函數(shù)使用A函數(shù)定義的數(shù)組,只有在A函數(shù)運(yùn)行期間才可以被其他函數(shù)使用,但A函數(shù)運(yùn)行完畢后,A函數(shù)中的數(shù)組將無(wú)法在被其他函數(shù)使用。#include<stdio.h&

42、gt;void g(int * pArr, int len) pArr2 = 88; /parr2=a2 等價(jià)于 void f(void) int a5 = 1,2,3,4,5; /數(shù)組a 只在f()執(zhí)行時(shí)有效 g(a,5);printf("%dn", a2);int main(void) f(); / 結(jié)果: 88/printf("a0 = %dn", a0); / error return 0;為什么需要?jiǎng)討B(tài)分配內(nèi)存很好的解決的了傳統(tǒng)數(shù)組的4個(gè)缺陷動(dòng)態(tài)內(nèi)存分配舉例_動(dòng)態(tài)數(shù)組的構(gòu)造 難點(diǎn)/*2011-05-01malloc是memory(內(nèi)存) all

43、ocate(分配)的縮寫(xiě)動(dòng)態(tài)內(nèi)存空間是怎么造出來(lái)的?*/#include <stdio.h>#include <malloc.h>int main(void)int i = 5; /分配了4個(gè)字節(jié),靜態(tài)分配int * p = (int *)malloc(100);/*1. 要使用malloc函數(shù),必須要添加malloc.h頭文件2. malloc函數(shù)只有一個(gè)形參,并且形參是整型3. 100表示請(qǐng)求系統(tǒng)為本程序分配100個(gè)字節(jié)4. malloc函數(shù)只能返回第一個(gè)字節(jié)的地址,但此時(shí)并不能確定該變量的類型,只有將這個(gè)地址被強(qiáng)制類型轉(zhuǎn)化成存放整型變量的地址,這時(shí)才傳達(dá)出指向整型

44、變量的信息。5. 系統(tǒng)總共分配了104個(gè)字節(jié)的內(nèi)存空間,p變量本身占4個(gè)字節(jié)(靜態(tài)分配),p所指向的內(nèi)存占100個(gè)字節(jié)(動(dòng)態(tài)分配) 若為int 則可存25個(gè),若為char則可存100個(gè)變量。6. p本身所占的內(nèi)存是靜態(tài)分配的,p所指向的內(nèi)存是動(dòng)態(tài)分配的*/free(p);/free(p)表示把p說(shuō)指向的內(nèi)存空間給釋放掉,/p本身的內(nèi)存不能釋放,只有main函數(shù)終止時(shí),由系統(tǒng)自動(dòng)釋放*p = 5; /*p代表的就是一個(gè)這int變量,*p這個(gè)整型變量的內(nèi)存分配方式和int i =5;不同。/*p是內(nèi)存是動(dòng)態(tài)分配的, int i是靜態(tài)的。printf("同志們好!n");retu

45、rn 0;-/*2011-05-01目的: malloc使用_2*/#include <stdio.h>#include <malloc.h>void f(int * q) /q是p的拷貝或副本 q等價(jià)于p *q等價(jià)于*p *q=200則*p=200/*p = 200; /error f()沒(méi)有p變量,p是在main()函數(shù)定義的/ q = 200; /error q是指針變量(地址),200是整數(shù)int *q = 200; /OK!類型一致/ * *q 語(yǔ)法錯(cuò)誤 !*q整型變量, 只有指針變量前可以加*/free(q);/把q指向的內(nèi)存釋放掉int main(void

46、)int * p = (int *)malloc(sizeof(int);/sizeof(int)=4;*p = 10;printf("%dn", *p); /10f(p);printf("%dn", *p); /200/ f()函數(shù)中 free(q)作用后,則輸出 -572662307(垃圾值)return 0;/*2011-05-02目的:動(dòng)態(tài)一維數(shù)組示例realloc(pArr, 100)/擴(kuò)充動(dòng)態(tài)內(nèi)存空間 (原來(lái)50變100;原來(lái)150變100)/保留原來(lái)動(dòng)態(tài)內(nèi)存中未被截取的內(nèi)容*/#include <stdio.h>#include

47、 <malloc.h>int main(void) /int a5; /系統(tǒng)靜態(tài)地分配20個(gè)字節(jié)的空間給數(shù)組aint len;int *pArr;printf("請(qǐng)輸入你要存放的元素個(gè)數(shù):" );scanf ("%d", &len);/5pArr = (int *)malloc(4*len);/pArr指向這20個(gè)字節(jié)動(dòng)態(tài)空間的前4個(gè)字節(jié)/*動(dòng)態(tài)的構(gòu)造了一個(gè)一維數(shù)組,該數(shù)組的長(zhǎng)度len, 數(shù)組名是pArr, 數(shù)組元素類型是int類似與int pArrlen; len可以根據(jù)需要變化*/對(duì)一維數(shù)組進(jìn)行操作,如:對(duì)動(dòng)態(tài)一維數(shù)組進(jìn)行賦值fo

48、r (int i=0; i<len; +i)scanf("%d", &pArri); printf("動(dòng)態(tài)數(shù)組元素為: n");/對(duì)一維數(shù)組進(jìn)行輸出for(i=0; i<len; +i)printf("%dn", pArri);free(pArr);/動(dòng)態(tài)空間被釋放printf("%dn", *(pArr+1); /動(dòng)態(tài)空間被釋放,原來(lái)動(dòng)態(tài)數(shù)組數(shù)元素內(nèi)容為垃圾值-572662307return 0;/*-在VC+6.0輸出結(jié)果:請(qǐng)輸入你要存放的元素個(gè)數(shù):44 6 8 10動(dòng)態(tài)數(shù)組元素為:4681

49、0*/使用動(dòng)態(tài)數(shù)組的優(yōu)點(diǎn):1.動(dòng)態(tài)數(shù)組長(zhǎng)度不需要事先給定;2.內(nèi)存空間可以手動(dòng)釋放;3.在程序運(yùn)行中,動(dòng)態(tài)內(nèi)存空間大小可以通過(guò)realloc函數(shù)手動(dòng)擴(kuò)充或縮小靜態(tài)內(nèi)存和動(dòng)態(tài)內(nèi)存的比較靜態(tài)內(nèi)存是由系統(tǒng)自動(dòng)分配,有系統(tǒng)自動(dòng)釋放靜態(tài)內(nèi)存是在棧分配的動(dòng)態(tài)內(nèi)存是由程序員手動(dòng)分配、手動(dòng)釋放動(dòng)態(tài)內(nèi)存是在堆分配的 /*2011-05-02目的: 多級(jí)指針 - 自己畫(huà)幾個(gè)示意圖 就會(huì)豁然開(kāi)朗。/#include <stdio.h>int main(void) int i = 10;/ iint * p = &i; / 最終 *p就是 i;int* *q = &p; / q 只能存放

50、int *類型的地址 即p 的地址&pint* *r = &q; / r 只能存放 int *類型的地址 即q 的地址&q/r = &p; /error! 因?yàn)閞是int*類型,只能存放int *類型變量的地址printf("i = %dn", *r); *r = q; *r = *q =p *r = *q = *p = i;printf("i = %dn", *q); *q = p ; *q = *p = i printf("i = %dn", *p); *p = i;printf("i =

51、 %dn", i);return 0;/*-在VC+6.0輸出結(jié)果:i = 10i = 10i = 10i = 10*/#include <stdio.h>/多級(jí)指針在函數(shù)中的應(yīng)用void f(int * q)*q = 100;/*q就是pvoid g()int i = 10;int * p = &i;printf("i = %d *p = %dn", i, *p);f(&p); /p是int *類型&p就是int * 類型printf("i = %d *p = %dn", i, *p); int main(

52、void) g();return 0;/*-在VC+6.0輸出結(jié)果:i = 10 *p = 10i = 100 *p = 100*/ #include <stdio.h>#include <malloc.h> void f(int * q) /q是p的拷貝副本*q = 1;void g(int *r)*r = 2;void h(int *s)*s = 3;void i(int *t)*t = 4;/要想修改函數(shù)變量的值,只能發(fā)送該變量的地址,修改一個(gè)以上的值,必須用指針int main(void) int *p = (int *)malloc(4);printf(&qu

53、ot;*p = %dn", *p);/垃圾值f(p); /調(diào)用的是指針printf("*p = %dn", *p);/1 g(&p);/調(diào)用的是指針變量的地址printf("*p = %dn", *p);/2/h(&(&p);/ error C2102: '&' requires l-valueint *pp = &p; /pp是存放p地址的指針, int * 整型指針的指針類型h(&pp); /調(diào)用的是存放p指針的指針的地址int *整型指針的指針的指針類型printf("*

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論