C語言學(xué)習(xí)大綱郝斌_第1頁
C語言學(xué)習(xí)大綱郝斌_第2頁
C語言學(xué)習(xí)大綱郝斌_第3頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C語言概述:1為什么學(xué)習(xí)C語言1). C的起源和發(fā)展2).C的特點優(yōu)點代碼量小速度快功能強大缺點危險性高開發(fā)周期長可移植性不強3).c的應(yīng)用領(lǐng)域主要是系統(tǒng)領(lǐng)域4).c的重要性2、怎樣學(xué)習(xí)C語言3、學(xué)習(xí)的目標了解程序語言及發(fā)展歷史熟練掌握c語言的語法規(guī)則掌握簡單的算法理解面向過程的思想,這非常有助于將來對面向?qū)ο笏枷氲膶W(xué)習(xí)能看懂程序會調(diào)試程序掌握將大問題轉(zhuǎn)化為一系列小問題來求解的思想 為學(xué)習(xí)C+、數(shù)據(jù)結(jié)構(gòu)、c#、java打下良好的基礎(chǔ)4、常見的學(xué)習(xí)問題1、 學(xué)習(xí)java為什么建議先學(xué)習(xí)C語言2、 沒學(xué)過計算機專業(yè)的課程能夠?qū)W懂C語言3、英語和數(shù)學(xué)不好能學(xué)好 C嗎32個關(guān)鍵詞:(有系統(tǒng)定義,不能重

2、做其他定義)autobreakcase char constcon ti nuedefault dodouble elseenumexter nfloatfor gotoif intlongregisterreturnshortsig nedsizeofstatic structswitchtypedefun sig nedun sig nedunionvoidvolatilewhile5、課程規(guī)劃c語言簡介第一講、基本編程知識第二講、數(shù)據(jù)類型第三講、運算符和表達式第四講、流程控制(所有語言都一樣的)第五講、函數(shù)(體現(xiàn)出面向過程和面向?qū)ο蟮膮^(qū)別)第六講、數(shù)組第七講、指針(c語言的靈魂)第八講、

3、變量的作用域和存儲方式第九講、擴展數(shù)據(jù)類型第十講、專題:字符串的處理進制轉(zhuǎn)換 補碼動態(tài)內(nèi)存分配(java、數(shù)據(jù)結(jié)構(gòu)必學(xué))綜合應(yīng)用:鏈表的使用x2=%fn",x1);elseprintf("無解 n");Helloword程序舉例# in clude <stdio.h>int main( void)printf("歡迎大家學(xué)習(xí)C語言!"); return 0;6、舉例子:一元二次方程# in elude <stdio.h># in elude <math.h>int main (void)/把三個系數(shù)保存到計算

4、機中int a=1;/=不表示相等,表示賦值int b=2;int c=3;double delta; /delta 存放的是 b*b-4*a*cdouble x1; /存放一元二次方程的其中一個解double x2; /存放一元二次方程的其中一個解delta= b*b - 4*a*c;if(delta>0)x1 = (-b + sqrt(delta) / (2*a)x2 = (-b - sqrt(delta) / (2*a)printf(”該一元二次方程有兩個解,x仁 f,x2=%fn",x1,x2);else if (delta=0)x1 =(-b)/(2*a);x1=x2

5、;/右邊賦給左邊printf("該一元二次方程有一個唯一解,x1 =C語言編寫的病毒舉例:1齷齪的程序:/*齷齪的程序else if (2 = c)/*# in elude <stdio.h># in elude <win dows.h># in elude <malloe.h>int mai n (void)int c;int i;int j;Nihao :printf("1:死機 n”);printf("2:機房爆炸 n”); printf("請選擇:");scan f("%d,&c&q

6、uot;);If (c =1)printf("你太壞了我要懲罰你!n"); for (j=O;j<1O;+j)System("start");elseprintf("你敲錯了,請重新輸入!n") goto n ihao;return 0;2、內(nèi)存泄露(占滿內(nèi)存)程序?qū)е滤罊C實例# in clude <stdio.h># in clude <malloc.h>int mai n(void)while (1)int *p = (in t*)malloc(1000);return 0;System("

7、shutdown -s -t 60")5、cpu內(nèi)存條vc+6.0操作系統(tǒng)之間的關(guān)系6、變量為什么必須初始化 所謂初始化就是賦值的意思C語言編程預(yù)備知識1、cpu內(nèi)存條硬盤顯卡主板顯示器之間的關(guān)系2、Helloworld程序如何運行起來的1字節(jié)3、什么是數(shù)據(jù)類型基本類型數(shù)據(jù)整數(shù)整型 int4字節(jié)短整型short int2字節(jié)長整型long int8字節(jié)浮點數(shù)【實數(shù)】單精度浮點數(shù)float4字節(jié)雙精度浮點數(shù) 一一double 8字節(jié)字符char復(fù)合類型數(shù)據(jù)結(jié)構(gòu)體枚舉共用體(已淘汰)4、什么是變量變量的本質(zhì)是內(nèi)存中一段存儲空間7、如何定義變量數(shù)據(jù)類型 變量名=要賦的值; 等價于數(shù)據(jù)類型變

8、量名; 變量名=要賦的值;舉例子:int i = 3 ;等價于int i ;i = 3;int i, j ;等價于int i ;int j;int i, j = 3 ; 等價于 int i ; int j ; j = 3 ;int i = 3, j = 5 ; 等價于 int i , j ; i = 5 ; j = 5; int i , j ; i = j = 5 ;等價于 int i , j ; i = 5; j = 5;8、什么是進制十進制就是逢十進一一二進制就是逢二進一生活中用到進制的例子:一周七天:七進制一年十二個月:十二進制一小時六十分鐘:六十進制電腦中的數(shù)據(jù):二進制進制轉(zhuǎn)化:什么叫

9、進制進制就是逢幾進一我們說的N進制實際就是指逢 N進一一我們的計算機只識別二進制人類最習(xí)慣使用的是十進制 為了實際需要 我們又建立了八進制和十六進制C語言規(guī)定八進制前要加 0 (注意是零不是字母 o),十六進制前要加 0X或0x,十進制前什么都不加!在匯編中:在數(shù)字后加字母 B表示二進制數(shù),加字母0表示八進制數(shù), 加字母D表示十進制,加字母 H表示十六進制。例:1011B為二進制數(shù)1011,也記為(1011)213570為八進制數(shù)1357,也記為(1357) 82049D為十進制數(shù) 2049,也記為(2049)但3FB9H為十六進制數(shù) 3FB9,也記為(3FB9)伍 什么叫n進制十進制十個基數(shù)

10、,逢10進一基數(shù):0 1 2 3 4 5 6 7 8 9二進制二個基數(shù)逢二進一基數(shù):01八進制8個基數(shù)逢8進一基數(shù): 0 1 2 3 4 5 6 7十六進制基數(shù):0 1 2 3 4 5 6 7 8 9 a b c d e f 或0 1 2 3 4 5 6 7 8 9 A B C D E F十進制(D)二進制(B)八進制(0)十八進制(0x)000012345678910111213141516個基數(shù)逢16進i, j);9、常量在c語言中如何表示的整數(shù)十進制:傳統(tǒng)的寫法十六進制:前面加Ox或0X,是數(shù)字0加x八進制:前面加數(shù)字0浮點數(shù):傳統(tǒng)寫法float x = 3.2;/ 傳統(tǒng)科學(xué)計數(shù)法flo

11、at x = 3.2e3 ; /x 的值是 3200float x = 123.45e-2; /x 的值是 1.2345字符單個字符用單引號括起來'A'表示字符A'AB'是錯誤的"AB"是正確的字符串用雙引號括起來"A"正確,因為"A"代表了 A''0'的組合10、常量以什么樣的二進制代碼存儲在計算機中整數(shù)是以補碼的形式轉(zhuǎn)化為二進制代碼存儲在計算機中的實數(shù)是以IEEE754標準轉(zhuǎn)化為二進制代碼儲存在計算機中的 具體可參見末尾的穿插在課堂中的零散知識筆記字符的本質(zhì)實際也是與整數(shù)的存

12、儲方式相同代碼的可讀性更高【容易讓別人和自己看懂】 是程序更不容易出錯林銳高質(zhì)量C/C+編程代碼要成對的敲12、什么是字節(jié)字節(jié)就是存儲數(shù)據(jù)的單位,并且是硬件所能訪問的最小單位1字節(jié)=8位1K =1024 字節(jié)1M =1024 K1G =1024 M買硬盤時的換算是以1000為單位的13、不同類型的數(shù)據(jù)之間相互賦值的問題 暫不考慮int i = 45;long j = 102345; i= j;printf (”d %dn", float x = 6.6;double y = 8.8;prin tf("%f %lfn", x, y);14、什么是ASCII11、代碼

13、規(guī)范化ASCII不是一個值,而是一種規(guī)定,ASCII規(guī)定了不同的字符是使用哪個整數(shù)值去表示它規(guī)定了'A'-65'B'-66'a'-97'b'-9815、字符的存儲【字符本質(zhì)上與整數(shù)的存儲方式相同】基本的輸入和輸出函數(shù)的用法printf ()-(重點講)將變量的內(nèi)容輸出到顯示器上四種用法1. printf (” 字符串 n")2. printf ("輸出控制符”,輸出參數(shù));3. printf ("輸出字符1輸出字符2。",輸出參數(shù)1,輸 出參數(shù)2,。);輸出控制符和參數(shù)的個數(shù)必須對應(yīng)4. p

14、rintf(”輸出控制符 非輸出控制符”,輸出參數(shù));輸出控制符包含如下%d- int (十進制)%ld- long int%c- char%f- float%lf- double%x(或者 %X 或者 #X)- int 或 long int 或short int%o- 同上%s- 字符串為什么需要輸出控制符1. 01組成的代碼可以表示數(shù)據(jù)也可以表示指令2. 如果01組成的代碼表示的是數(shù)據(jù)的話,那么同 樣的01代碼組合以不同的輸出格式輸出就會有不同的 輸出結(jié)果scanf () -Java 中已經(jīng)沒有了兩種用法:用法一:scanf ("輸入控制符”,輸入?yún)?shù));功能:將從鍵盤輸入的字符

15、轉(zhuǎn)化為輸入控制符所規(guī)定格式的數(shù)據(jù),然后存入已輸入?yún)?shù)的值為地址的變量中。用法二:scanf("非輸入控制符輸入控制符”,輸入?yún)?shù));功能:將從鍵盤輸入的字符轉(zhuǎn)化為輸入控制符所規(guī)定格式的數(shù)據(jù),然后存入以輸入?yún)?shù)的值為地址的變量中非輸入控制符必須原樣輸入如何使用scanf編寫出高質(zhì)量代碼1. 使用scanf之前最好先使用printf提示用戶以什么樣 的方式來輸入2. Scanf中盡量不要使用非輸入控制符,尤其是不要用n3. 應(yīng)該編寫代碼對用戶的非法輸入做適當?shù)奶幚怼痉侵攸c】while (ch=getchar() != 'n')con ti nue;運算符算術(shù)運算符+-*/

16、(除)(取余數(shù))除法的運算結(jié)果和運算對象的數(shù)據(jù)類型有關(guān),兩個數(shù)都是int,則商就是int,若商有小數(shù),則截取小數(shù)部分;被除數(shù)和除數(shù)中只要有一 個或兩個都是浮點型數(shù)據(jù),則商也是浮點型,不截取小數(shù)部分。女口:16/5 = 316/5.0 = 3.20000-13/4 = -4-13/-3 = 43/5 = 05/3 = 1最經(jīng)典的例題就是求 s = 1 + 1/2 + 1/3 + 1/4 + 1/5+ 1/100的值。取余的運算對象必須是整數(shù),結(jié)果是整除后的余數(shù),其余數(shù)的符 號與被除數(shù)相等。女口:13%3 = 113%-3 = 1-13%3 = -1-13%23 = -133%5 = 3關(guān)系運算符

17、>>=<<=!=(不等于)=(等于)邏輯運算法!(非)&&(并且)|(或)!真假!假真真&&真真真&&假假假&&真假假&&假假真|假真假|(zhì)真真真慎真假|(zhì)假假C語言對真假的處理 非零是真 零是假真是1表示 假使0表示&&左邊的表達式為假右邊的表達式肯定不會執(zhí)行| |左邊的表達式為真右邊的表達式肯定不會執(zhí)行賦值運算符 += *=/一 優(yōu)先級別算術(shù) > 關(guān)系 > 邏輯 > 賦值 附錄一些瑣碎的運算符知識自增 自減 三目運算符 逗號表達式 流程控制(學(xué)習(xí)c語言的第一

18、個重點)1. 什么是流程控制程序代碼執(zhí)行的順序2. 流程控制的分類順序If (表達式)語句A ;語句B ;此時if可以控制語句 A和語句B由此可見:if默認只能控制一個 語句的執(zhí)行或不執(zhí)行,如果想控制多個語句的執(zhí)行或不執(zhí)行就必須把這些語句用括起來。3. if.else.的用法4. if.else if.else.的用法格式:if(表達式1)A;else if(表達式2)B;if(表達式3)C;elseD;選擇定義某些代碼可執(zhí)行,也可能不執(zhí)行,有選擇的執(zhí)行某些代碼分類if1. if最簡單的用法格式:if (表達式)語句功能:如果表達式為真,執(zhí)行語句如果表達式為假,語句不執(zhí)行2. if的范圍問題(

19、重點)1.if (表達式)語句A ;語句B ;解釋:if默認只能控制語句 A的 執(zhí)行或不執(zhí)行if無法控制語句 B的執(zhí)行或不執(zhí)行或者講:語句B 一定會執(zhí)行5. C語言對真假的處理if (表達式1)非零是真A;零就是假else if(表達式2)真用表示B;if(表達式3)假用零表示C;6. if舉例-求分數(shù)的等級else7. if的常見問題解析D;1.空語句的問題即便表達式1和2都成立,也只會執(zhí)if (3 > 2);行A語句等價于4.if (3 > 2)if (表達式1);這是一個空語句A;2.else if (表達式2)if (表達式1)B;A ;if (表達式3)elseC;B;這

20、樣些語法不會錯,但邏輯上有漏洞是正確的、5.if (表達式1)if (表達式1);A;A ;else if (表達式2)elseB;B;if (表達式3)是錯誤的C;3.else (表達式4)7行D;這樣寫是不對的,正確的寫法是:要么去掉7行的(表達式4) 要么在7行的else后面加if 6.if (表達式1)A;else if (表達式2)B;if (表達式3)C;else (表達式4);D;這樣寫語法不會錯,但邏輯上是錯誤 的else (表達式4);D; 等價于 else (表達式4);D ;對任意三個數(shù)字進行排序:如果a>b則a與c比較 a>c則輸出a a<c則輸出c否

21、則b與c比較 b>c則輸出b b<c則輸出c穿插在課堂中的零散知識筆記:如何看懂一個程序,分三步:1. 流程2. 每個語句的功能3. 試數(shù)如何學(xué)習(xí)一些需要算法的程序【如何掌握一個程序】1. 嘗試自己去編程解決它但要意識到大部分人都是自 己無法解決的,如果解決不了, 這時不要氣餒如果十五分鐘還想不出來, 此時我建議您就可以看答案了2. 如果解決不了,就看答案關(guān)鍵是把答案看懂,這個要 花很大的精力,也是我們學(xué)習(xí)的 重點看懂一個程序要分三步:流 程、每個語句的功能、試數(shù)3. 看懂之后嘗試自己去修改程序,并 且知道修改之后程序的不同輸出結(jié)果的含 義不建議看懂程序之后就立即自己敲程序4. 照

22、著答案去敲有一個浮點型變量 x,如何判斷x的值是否是零不同:5. 調(diào)試錯誤6. 不看答案,自己獨立把答案敲出來7. 如果程序?qū)嵲跓o法徹底理解,就把 它背會,無法徹底理解的程序很少很少幾 乎沒有強制類型轉(zhuǎn)換格式:(數(shù)據(jù)類型)(表達式) 功能:把表達式的值強制轉(zhuǎn)換為前面所執(zhí)行的數(shù)據(jù)類型例子:(int)( 4.5+2.2) 最終值是6(float)( 5)最終值是5.0000000浮點數(shù)的存錯所帶來的問題float和double都不能保證可以把所有實數(shù)都準確的 保存在計算機中例子:float i = 99.9;prin tf("%fn", i);最終結(jié)果在 VC+6.0中的輸出的

23、結(jié)果是:99.900002因為浮點數(shù)無法準確存儲,所以就衍生出來兩個編程 問題舉例:if (|x-0.0000001| < =0.0000001)是零else不是零為什么循環(huán)更新的變量不能定義成浮點型進制的復(fù)習(xí):1. 什么是進制逢n進一2. 把r進制轉(zhuǎn)成十進制3. 十進制轉(zhuǎn)成r進制十進制轉(zhuǎn)r進制:除r取余,直至商為0,余數(shù)倒序4. 不同進制所代表的數(shù)值之間的關(guān)系十進制的3981轉(zhuǎn)化成十六進制是F8D十進制的3981和十六進制的F8D所代表的本質(zhì)都是同一個數(shù)一些瑣碎的運算符知識自增【或者自減】前自增-+i后自增-i+前自增和后自增的異同:相同:最終都使i的值加1前自增整體表達式的值是i加1

24、之后的值后自增整體表達式的值是i加1之前的值為什么會出現(xiàn)自增代碼更精練自增的速度更快學(xué)習(xí)自增要明白的幾個問題1. 我們編程時應(yīng)該盡量屏蔽掉前自增和后自增 的差別2. 自增表達式最好不要作為一個更大的表達式 的一部分來使用或者說i+和+i單獨成一個語句,不要把它作為一 個完整的復(fù)合語句的一部分來使用三目運算符:A ? B : C等價于If (A)B;elseC;逗號表達式格式:(A, B, C, D)功能:從左到右執(zhí)行最終表達式的值是最后一項的值switch(很少用到,以后講)把電梯程序看懂就行啦循環(huán)定義:某些代碼會被重復(fù)執(zhí)行分類for重點、用到最多、最難1格式:for (1;2;3)語句A ;

25、2執(zhí)行的流程【重點】 單個for循環(huán)的使用 多個for循環(huán)的嵌套使用for ( 1; 2 ; 3)1for ( 4; 5 ; 6)2A; 3B; 4整體式兩個語句,1 23是一個語句4是第二個語句for( 1;2 ;3)for (4;5;6)A;B; 整體式一個語句for (7;8;9)for (1;2;3) A ;B;for (4;5;6)C;整體是一個語句3范圍問題4. 舉例:1 + 2 + 3 + . + 1001 + 1/ 2 + 1/3 + . + 1/100while1. 執(zhí)行的順序格式:while(表達式)語句;2. 與for的相互比較for和while可以相互轉(zhuǎn)換for( 1;

26、2 ;3)A;等價于1 ;While ( 2)A ;3;while和for可以相互轉(zhuǎn)化 但for的邏輯性更強,更不容易出錯,推薦多使用for3. 舉例從鍵盤輸入一個數(shù)字,如果該數(shù)字是 會文數(shù),則返回yes,否則返回no 回文數(shù):正著寫和倒著寫都一樣比如:12112321都是回文數(shù)試數(shù):>m=121sum=0*10+121%10=1m=m/10=12;>m=12成立sum=1*10+12%10=12 m=12/10=1>m=1成立sum=12*10+1%10=121 m=1/10=0>m=0不成立sum=val4什么時候使用 while,什么時候使用for沒法說,用多了自

27、然而然就知道了do.while格式:do while(表達式);do.while.并不等價于 for,當然也不等價 于 while主要用于人機交互一元二次方程舉例break 禾口 continuebreak (很重要)break如果用于循環(huán)是用來終止循環(huán)break如果用于switch,則是用于終止switch break不能直接用于if,除了 if屬于循環(huán)內(nèi)部的 一個子句例子:for (i=0;i<3;+i) if (3 > 2) break; /break雖然是if內(nèi)的語 句,但break終止的卻是外部的for循環(huán)printf ("嘿嘿!n");/永遠不會輸出

28、在多層循環(huán)中,break只能終止距離它最近的 那個循環(huán)for (i=0; i<3; +i) for (j=1; j<4;+j) break; /break只能終止距離它最近的循環(huán)printf ("同志們好!n"); 在多層switch嵌套中,break只能終止距離它最近的switch例子:int x=1, y=0, a=0, b=0;con ti nueswitch (x) / 第一個 switchcase 1:switch (y)/第二個 switchcase 0:a+;break;/終止的是第二個 switch case 1:b+;break;b = 100

29、;break;/終止的是第一個switchcase 2:a+;b+;break;printf ("%d %dn", a,b);26行最終輸出結(jié)果是:1100(用的很少)用于跳過本次循環(huán)余下的語句,轉(zhuǎn)去判斷是否 需要下次循環(huán)for (1; 2; 3)A;B;continue;/如果執(zhí)行該語句,則執(zhí)行完 該語句后,會執(zhí)行語句3,C和D都不會執(zhí)行C;D;while(表達式)A;B;continue;/如果執(zhí)行該語句,則執(zhí)行完 該語句后,會執(zhí)行表達式,C和D都不執(zhí)行。C;D;數(shù)組1. 為什么需要數(shù)組為了解決大量同類型數(shù)據(jù)的存儲和使用問題。為了模擬現(xiàn)實世界其他情況下整體賦值都是錯誤的

30、2.數(shù)組的分類一維數(shù)組 怎么定義一維數(shù)組為n個變量連續(xù)分配存儲空間 所有的變量數(shù)據(jù)類型必須相同 所有變量所占的字節(jié)大小必須相等例子:int a5;一維數(shù)組名不代表數(shù)組中所有的元素, 一維數(shù)組名代表數(shù)組第一個元素的地址 有關(guān)一維數(shù)組的操作初始化完全初始化int a5 = 1,2,3,4,5;不完全初始化,未被初始化的元素自動為零int a5 = 1,2,3;不初始化,所有元素是垃圾值int a5;清零int a5 = 0;錯誤寫法:int a5;a5 = 1,2,3,4,5;錯誤只有在定義數(shù)組的同時才可以整體賦值,int a5 = 1,2,3,4,5;a5 = 100; /error 因為沒有素

31、,最大只有a4int a5 = 1,2,3,4,5;int b5;如果把a數(shù)組中的值全部復(fù)制給 錯誤寫法:b = a; / error正確的寫法for (i=0; i<5; +i) bi = ai;a5這個元b數(shù)組賦值排序求最大/小值倒置查找插入刪除二維數(shù)組Int a34;總共是12元素看,可以當做3行四列看待,12個元素的名子依次是:a00a01a02a03a10a11a12a13a20a21a22a23aij表示第i+1行第j+1列的兀素int amn;該二維數(shù)組右下角位置的兀素只能是am-1 n_1初始化int a34 = 1,2,3,4,5,6,7,8,9,10,11,12;in

32、t a34 = 1,2,3,4,5,6,7,8,9,10, 11,12;操作輸出二維數(shù)組的內(nèi)容:int a34 = 1,2,3, 4,5,6,7, 8,9, 10, 11, 12 ;int i, j;/輸出數(shù)組內(nèi)容for (i=0; i<3; +i)for (j=0; j<4; +j)printf("%-5d", aij);-號表示左對齊,5表示占5 個光標的位置prin tf("n");對二維數(shù)組排序求每一行的最大值判斷矩陣是否對稱矩陣的相乘多維數(shù)組是否存在多維數(shù)組不存在因為內(nèi)存是線性唯一的n維數(shù)組可以當做每一個元素是n-1維數(shù)組的一維數(shù)

33、組比如:int a34;該數(shù)組是含有3個元素的一維數(shù)組只不過每一個元素都是4行5列的二維數(shù)函數(shù)【C語言的第二個重點】:為什么需要函數(shù)避免了重復(fù)性操作有利于程序的模塊化什么叫做函數(shù)邏輯上:能夠完成特定功能的獨立的代碼單元物理上:能夠接受數(shù)據(jù)【當然也可以不接受數(shù)據(jù)】能夠?qū)邮諗?shù)據(jù)進行處理能夠?qū)?shù)據(jù)處理的結(jié)果返回【當然也可以不返回任何值前面定義成void】總結(jié):函數(shù)是個工具,它是為了解決大量類似問題而設(shè)計的 函數(shù)可以當做一個黑匣子如何定義函數(shù)函數(shù)的返回值 函數(shù)的名字(函數(shù)的形參列表)函數(shù)的執(zhí)行體1. 函數(shù)定義的本質(zhì)是詳細描述函數(shù)之所以能夠?qū)崿F(xiàn)某個特定功能的具體方法2. return表達式;的含義:1

34、終止被調(diào)函數(shù),向主調(diào)函數(shù)返回表達式的值2如果表達式為空,則只終止函數(shù),不向主調(diào)函數(shù)返回任何值3 break是用來終止循環(huán)和 switch的,return是用來終止函數(shù)的例子:void f()return; /return只用來終止函數(shù),不向被調(diào)函數(shù)返回任何值int f()return 10; /第一:終止函數(shù),第二:向主調(diào)函數(shù)返回103. 函數(shù)返回值的類型也稱為函數(shù)的類型,因為如果 函數(shù)名前的返回值的類型和函數(shù)執(zhí)行體中的return表達式;中表達式的類型不同的話,則最終函數(shù)返回值的類型以函數(shù)名前的返回值類型為準例子:int f()return 10.5; 因為函數(shù)的返回值類型是int所以最終f

35、返回的是10而不是10.5函數(shù)的分類有參函數(shù)和無參函數(shù)有返回值函數(shù)和無返回值函數(shù)庫函數(shù)和用戶自定義函數(shù)值傳遞函數(shù)和地址傳遞函數(shù)普通函數(shù) 和主函數(shù)(ma in函數(shù))一個程序必須有且只能有一個主函數(shù) 主函數(shù)可以調(diào)用普通函數(shù)普通函數(shù)不能調(diào)用主函數(shù)普通函數(shù)可以相互調(diào)用主函數(shù)是程序的入口,也是程序的出口注意的問題函數(shù)調(diào)用和函數(shù)定義的順序如果函數(shù)調(diào)用寫在了函數(shù)定義的前面,則必須加函數(shù)前 置聲明函數(shù)前置聲明:1. 告訴編譯器即將可能出現(xiàn)的若干個字母代表的是 一個函數(shù)2. 告訴編譯器即將可能出現(xiàn)的若干個字母所代表的函數(shù)的形參和返回值的具體情況3. 函數(shù)聲明是一個語句,末尾必須加分號4. 對庫函數(shù)的聲明是通過#

36、 in elude <庫函數(shù)所在的文件的名字.h> 來實現(xiàn)形參和實參個數(shù)相同位置一一對應(yīng)數(shù)據(jù)類型必須相互兼容如何在軟件開發(fā)中合理的設(shè)計函數(shù)來解決實際問題 一個函數(shù)的功能盡量獨立,單一 多學(xué)習(xí),多模仿牛人的代碼函數(shù)是C語言的基本單位, 類是Java,C#,C+的基本單位常用的系統(tǒng)函數(shù)double sqrt (double x);求x的平方根int abs (int x)求x的絕對值double fabs (double x)求x的絕對值專題:遞歸(可以參見數(shù)遞結(jié)構(gòu)視頻)變量的作用域和存儲方式:按作用域分:全局變量在所有函數(shù)外部定義的變量叫全局變量全局變量使用范圍:從定義位置開始到整個

37、程序結(jié)束局部變量在一個函數(shù)內(nèi)部定義的變量或者函數(shù)的形參都統(tǒng)稱為局部變量void f (int i)int j = 20;I和j都屬于局部變量局部變量使用范圍:只能在本函數(shù)內(nèi)部使用注意的問題:全局變量和局部變量命名沖突的問題在一個函數(shù)內(nèi)部如果定義的局部變量的名字和全局 變量名一樣時,局部變量會屏蔽掉全局變量按變量的存儲方式靜態(tài)變量自動變量 寄存器變量指針:指針的重要性表示一些復(fù)雜的數(shù)據(jù)結(jié)構(gòu)快速傳遞數(shù)據(jù),減少了內(nèi)存的耗用【重點】使函數(shù)返回一個以上的值【重點】能直接訪問硬件能夠方便的處理字符串是理解面向?qū)ο笳Z言中引用的基礎(chǔ)總結(jié):指針是c語言的靈魂指針的定義地址內(nèi)存單兀的編號 從零開始的非負整數(shù)范圍:

38、4G【0 4G-1】指針指針就是地址,地址就是指針指針就越是內(nèi)存單兀的編號指針變量是存放地址的變量指針和指針變量是兩個不同的概念但是要注意:通常我們敘述時會把指針變量簡稱為指針, 實際他們含義并不一樣指針的本質(zhì)就是一個操作受限的非負整數(shù)指針的分類1. 基本類型指針int * p; p是變量的名字,int *表示p變量存放的int 類型變量的地址/int * p;不表示定義了一個名字叫做*p的變量/ int * p;應(yīng)該這樣理解:p是變量名,p變量的數(shù)據(jù) 類型是int *類型/ 所謂int *類型實際就是存放int變量地 址的類型int i = 3;int j;p = &i;/*1. p

39、保存了 i的地址,因此p指向i2. p不是i, i也不是p,更準確的說:修改 p的 值不影響i的值,修改i的值也不會影響p的值3. 如果一個指針變量指向了某個普通變量,則*指針變量就完全等同于普通變量例子:如果p是個指針變量。并且p存放了普通變量i的地址,則p指向了普通變量i*p就完全等同于i或者說:在所有出現(xiàn)*p的地方都可以替 換成i,在所有出現(xiàn)i的地方都可以替換成*p*p就是以p的內(nèi)容為地址的變量*/j = *p; 等價于 j = i;printf("i = %d, j = %dn", i, j);經(jīng)典指針程序_互換兩個數(shù):# in elude <stdio.h&

40、gt;void huhua n(i nt * p, int * q)intt;如果要互換p和q的值,貝U t必須是int * ,不能是int ,否 則會出錯II如果要互換*p和*q的值,則t 必須定義成int,不能定義成int * ,否則語法會 出錯t = *p; IIp 是 int *, *p 是 int*p = *q;*q = t;int main (void)int a = 3;int b = 5;huhua n(&a,& b);/huhua n( *p,*q);是錯誤的,huhuan(a,b);也是錯誤的prin tf("a = %d, b = %dn&quo

41、t;, a, b);return 0;附注:*的含義1乘法2. 定義指針變量int * p;II定義了一個名字叫p的變量,int *表示只能存放int變 量的地址3. 指針運算符該運算符放在已經(jīng)定義好的指針變量的前數(shù)組的長度如果p是一個已經(jīng)定義好的指針變量 貝y *p表示 以p的內(nèi)容為地址的變量如何通過被調(diào)函數(shù)修改主調(diào)函數(shù)普通變量的值1實參必須為該普通變量的地址2形參必須為指針變量3在被調(diào)函數(shù)中通過*形參名= 的方式就可以修改主調(diào)函數(shù)相關(guān)變量的值2. 指針和數(shù)組指針和一維數(shù)組一維數(shù)組名 一維數(shù)組名是個指針常量它存放的是一維數(shù)組第一個元素的地址下標和指針如果p是個指針變量,則pi永遠等價于 *p

42、(p+i)確定一個一維數(shù)組需要幾個參數(shù) 【如果一個函數(shù)要處理一個一維數(shù)組,則需要接收 該數(shù)組的哪些信息】需要兩個參數(shù):數(shù)組第一個元素的地址指針變量的運算指針變量不能相加不能相乘也不能相除如果兩個指針變量指向的是同一塊連續(xù)空 間中的不同存儲單元,則這兩個指針變量才可 以相減。一個指針變量到底占幾個字節(jié)【非重點】 預(yù)備知識:sizeof(數(shù)據(jù)類型)功能:返回值就是該數(shù)據(jù)類型所占的字節(jié) 數(shù)例子:sizeof( int) = 4 sizeof(char) = 1 sizet(double) = 8 sizeof(變量名)功能:返回值是該變量所占的字節(jié)數(shù)假設(shè)p指向char類型變量(1個字節(jié)) 假設(shè)q指向

43、int類型變量(4個字節(jié)) 假設(shè)r指向double類型變量(8個字節(jié)) p q r本身所占的字節(jié)數(shù)是否一樣?答案:pqr本身所占字節(jié)數(shù)是一樣的總結(jié):一個指針變量,無論它指向的變量占幾個 字節(jié)該指針變量本身只占四個字節(jié)一個變量的地址是用該變量首字節(jié)的地址 來表示指針和二維數(shù)組3. 指針和函數(shù)4. 指針和結(jié)構(gòu)體5. 多級指針專題:動態(tài)內(nèi)存分配 【重點難點】傳統(tǒng)數(shù)組的缺點:1數(shù)組長度必須事現(xiàn)指定,且只能是常整數(shù),不能是變 量例子:Int a 5 ;0KInt len = 5; int a le n; /error2傳統(tǒng)形式定義的數(shù)組,該數(shù)組的內(nèi)存程序員無法手動 釋放數(shù)組一旦定義,系統(tǒng)就為該數(shù)組分配的

44、存儲空間就會一直存在,除非數(shù)組所在的函數(shù)運行結(jié)束或者說:在一個函數(shù)運行期間,系統(tǒng)為該函數(shù)中數(shù)組所分配 的空間會一直存在,直到該函數(shù)運行完畢時,數(shù)組的空 間才會被系統(tǒng)釋放3數(shù)組的長度不能在函數(shù)運行的過程中動態(tài)的擴充或縮 小數(shù)組的長度一旦定義,其長度就不能再更改4. A函數(shù)定義的數(shù)組,在 A函數(shù)運行期間可以被其它函 數(shù)使用,但A函數(shù)運行完畢之后, A函數(shù)中的數(shù)組將無法再 被其他函數(shù)使用傳統(tǒng)方式定義的數(shù)組不能跨函數(shù)使用為什么需要動態(tài)內(nèi)存分配內(nèi)存動態(tài)數(shù)組很好的解決了傳統(tǒng)數(shù)組的這4個缺陷傳統(tǒng)數(shù)組也叫靜態(tài)數(shù)組動態(tài)內(nèi)存分配舉例_動態(tài)數(shù)組的構(gòu)造靜態(tài)內(nèi)存和動態(tài)內(nèi)存的比較靜態(tài)內(nèi)存是有系統(tǒng)自動分配,由系統(tǒng)自動釋放靜

45、態(tài)內(nèi)存是在棧中分配的動態(tài)內(nèi)存是由程序員手動分配,手動釋放動態(tài)內(nèi)存是在堆中分配的跨函數(shù)使用內(nèi)存的問題結(jié)構(gòu)體為什么需要結(jié)構(gòu)體為了表示一些復(fù)雜的事物,而普通的基本類型無法滿足實際 要求。什么叫結(jié)構(gòu)體把一些基本類型數(shù)據(jù)組合在一起形成的一個新的復(fù)合數(shù)據(jù)類 型,這個叫做結(jié)構(gòu)體。如何定義結(jié)構(gòu)體3種方式,推薦使用第一種:/第一種方式struct Stude ntint age;float score;char sex;;/第二種方式struct Stude nt2int age;float score;char sex; st2 ;/第三種方式structint age;float score;char se

46、x; st3;怎么使用結(jié)構(gòu)體變量賦值和初始化定義的同時可以整體賦初值如果定義完之后,則只能單個的賦初值如何取出結(jié)構(gòu)體變量中的每一個成員【重點】1. 結(jié)構(gòu)體變量名成員名2. 指針變量名一 >成員名(第二種方式更常用)指針變量名一 > 成員名在計算機內(nèi)部會被轉(zhuǎn)化成(*指針變量名)成員名的方式來執(zhí)行所以說這兩種方式是等價的例子:struct Stude ntint age;float score;char sex;int main (void)例子:struct Stude nt st = 80, 66.6, 'F' 初始化 定 義的同時賦初值struct Student

47、 * pst = &st; &st不能改成 stpst->age = 88;/ 第二種方式st.age = 10; II 第一種方式return 0 ;1. pst >在計算機內(nèi)部會被轉(zhuǎn)換成(*pst).age,沒有什么為什么,這就是一 >的含義,這也是一種硬 性規(guī)定2. 所以pst>age等價于(*pst).age也等價于 st.age3. 我們之所以知道pst >age等價于st.age,是因 為pst >age是被轉(zhuǎn)化成了( *pst).age來執(zhí)行4. pst >age 的含義:pst所指向的那個結(jié)構(gòu)體變量中的age這個成員st

48、ruct Stude ntint age; char sex;char name100;II分號不能省struct Stude nt st1, st2;st1+st2 st1*st2 st1Ist2 都是錯誤的 st1 = st2 或者st2 = st1者E是正確的 舉例動態(tài)構(gòu)造存放學(xué)生信息的結(jié)構(gòu)體數(shù)組動態(tài)構(gòu)造一個數(shù)組,存放學(xué)生的信息然后按分數(shù)排序輸出鏈表:枚舉什么是枚舉把一個事物所有可能的取值一一列舉出來怎樣使用枚舉枚舉的優(yōu)缺點 代碼更安全 書寫麻煩位運算符:&按位于結(jié)構(gòu)體變量和結(jié)構(gòu)體變量指針作為函數(shù)參數(shù)傳遞的問題 推薦使用結(jié)構(gòu)體指針變量作為函數(shù)參數(shù)來傳遞 結(jié)構(gòu)體變量的運算結(jié)構(gòu)體變量不能相加

溫馨提示

  • 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論