C語言復(fù)習(xí)備課講稿_第1頁
C語言復(fù)習(xí)備課講稿_第2頁
C語言復(fù)習(xí)備課講稿_第3頁
C語言復(fù)習(xí)備課講稿_第4頁
C語言復(fù)習(xí)備課講稿_第5頁
已閱讀5頁,還剩99頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C語言復(fù)習(xí)PPT變量類型的轉(zhuǎn)換自動(dòng)轉(zhuǎn)換發(fā)生在不同數(shù)據(jù)類型的變量混合運(yùn)算時(shí),由編譯系統(tǒng)自動(dòng)完成

強(qiáng)制轉(zhuǎn)換通過類型轉(zhuǎn)換運(yùn)算來實(shí)現(xiàn)

(類型說明符)(表達(dá)式)(int)(a+b)結(jié)合性在表達(dá)式中,各運(yùn)算量參與運(yùn)算的先后順序不僅要遵守運(yùn)算符優(yōu)先級(jí)別的規(guī)定,還要受運(yùn)算符結(jié)合性的制約,以便確定是自左向右進(jìn)行運(yùn)算還是自右向左進(jìn)行運(yùn)算算術(shù)運(yùn)算符的結(jié)合性是自左至右,即先左后右:x-y+z賦值運(yùn)算符是右結(jié)合性運(yùn)算符:x=y=z;一、算術(shù)運(yùn)算符

基本的算術(shù)運(yùn)算符:

+-*/%

說明:(1)在“/”運(yùn)算中,若操作數(shù)均為整數(shù),則執(zhí)行整除運(yùn)算,舍去小數(shù)部分。例如:5/3=1(2)“%”要求兩側(cè)均

為整數(shù),“%”運(yùn)算不能用于float和double型數(shù)據(jù)例如:5%3=2(3)*/%的優(yōu)先級(jí)高于+-

二、自增、自減運(yùn)算符(++、--)

++i,--i (先加/減1,然后取i的值)

i++,i-- (先取i的值,然后加/減1)

b=2,a=2b=2,a=3作用:使變量的值增1或減1,如:例如:inta=1,b;b=++a;b=a++;先使用i的值,再執(zhí)行i=i+1先執(zhí)行i=i+1,再使用i的值++ii++說明:1.++、--只能用于變量,不能用于常量或表達(dá)式。例如:10++,(x+y)++

,++’a’,b++中合法的為:2.自增、自減運(yùn)算符為右結(jié)合性。例如:-a++b++-(a++)3.常用于循環(huán)變量自動(dòng)加14.表達(dá)式中運(yùn)算符的組合,盡可能左結(jié)合如:I+++J(I++)+J5.表達(dá)式中使用自加或自減運(yùn)算時(shí),需注意

如:I=3

K=(I++)+(I++)+(I++)結(jié)果:k=9,I=6如:I=3

I=(I++)+(++I)+(I++)結(jié)果:I=14若a=2,b=3,x=3.5,y=2.5,則表達(dá)式(float)(a+b)/2+(int)x%(int)y的值是

3.5表達(dá)式1/4+2.75的值是2.75三、賦值運(yùn)算符和賦值表達(dá)式1.賦值運(yùn)算符為“=”

形式:變量名=常量或表達(dá)式作用:將一個(gè)數(shù)據(jù)賦給一個(gè)變量右結(jié)合性例如:a=3;b=c+d;C規(guī)定:任何表達(dá)式在末尾加上分號(hào)就構(gòu)成語句。如:A=B+C——表達(dá)式

A=B+C;——語句“=”號(hào)兩端數(shù)據(jù)類型不同時(shí)進(jìn)行轉(zhuǎn)換

轉(zhuǎn)換是系統(tǒng)自動(dòng)進(jìn)行的,右邊轉(zhuǎn)換為左邊類型。規(guī)則如下:

(1)整型=實(shí)型舍去小數(shù)部分(2)實(shí)型=整型值不變,以浮點(diǎn)形式存放(3)整型=字符型值放入低8位,高8位為0

(4)字符型=整型僅將整型低8位存入

六、關(guān)系運(yùn)算符和關(guān)系表達(dá)式C語言中的關(guān)系運(yùn)算符有6種。(左結(jié)合性)<、<=、>、>=、==、?。?.算術(shù)運(yùn)算符(高)

關(guān)系運(yùn)算符賦值運(yùn)算符(低)優(yōu)先次序:1.前4種同級(jí),高于后2種(后2種同級(jí))例如:x!=y、s-d<=f、a>b+c、a==b>c關(guān)系運(yùn)算符運(yùn)算出的結(jié)果為0或10,表示假,即該關(guān)系不成立1,表示真,即該關(guān)系成立在所有涉及到真假判斷的地方,0表示假,非0表示真

優(yōu)先級(jí):!

高于

&&

高于

||

混合運(yùn)算中:

!

高算術(shù)運(yùn)算關(guān)系運(yùn)算

&&、||

低賦值運(yùn)算注:如何判斷一個(gè)邏輯表達(dá)式為“真、假”?用“非0”代表“真”,用“0”代表“假”。如:‘b’&&0值為:“0”邏輯表達(dá)式:

運(yùn)算結(jié)果為邏輯值編譯系統(tǒng)以非0、0判定邏輯值真、假

邏輯表達(dá)式中作為參加邏輯運(yùn)算的運(yùn)算對(duì)象可以是0或非0數(shù)值。但要區(qū)分運(yùn)算對(duì)象。例:5>3&&2||8<4!=0值為1邏輯表達(dá)式與關(guān)系表達(dá)式的區(qū)別:

邏輯表達(dá)式:

關(guān)心的是——表達(dá)式的值

用表達(dá)式的值等于0或不等于0來判斷條件是否成立.

不等于0,則結(jié)果為“真”;等于0,則結(jié)果為“假”例:intx=-2;ifxprintf("hello");/*結(jié)果為輸出hello*/條件運(yùn)算:根據(jù)條件確定某個(gè)表達(dá)式結(jié)果的值。(C語言中唯一的一個(gè)三目運(yùn)算)

運(yùn)算符:?和

:條件表達(dá)式形式:

表達(dá)式1?表達(dá)式2:表達(dá)式3八、條件運(yùn)算符和條件表達(dá)式

執(zhí)行過程:

(2)結(jié)合方向?yàn)椤坝业阶蟆保?)條件運(yùn)算優(yōu)于賦值運(yùn)算如:max=a>b?a:b將條件表達(dá)式的值賦給變量max說明:例:設(shè)a,b,c,d的值為1、2、3、4求下述表達(dá)式的值

max=a>b?a:c>d?c:d

等價(jià)于

max=a>b?a:(c>d?c:d)

結(jié)果為:4

優(yōu)先級(jí):!

高于

&&

高于

||

混合運(yùn)算中:

!

高算術(shù)運(yùn)算關(guān)系運(yùn)算

&&、||

低賦值運(yùn)算表達(dá)式:2&&-2的值是

1設(shè)x、y和z是int類型變量,且x=3;y=4;z=5;則下面表達(dá)式中的值為0的是

。

A.‘x’&&‘y’B.x<=y

C.x||y+z&&y-z

D.!((x<y)&&!z||1)D格式:printf(“格式控制串”,輸出表)功能:按指定格式向顯示器輸出數(shù)據(jù)返值:正常,返回輸出字節(jié)數(shù);出錯(cuò),返回EOF(-1)格式輸出函數(shù)輸出表:要輸出的數(shù)據(jù)(可以沒有,多個(gè)時(shí)以“,”分隔)格式控制串:包含兩種信息:1.格式說明:

%[修飾符]格式字符

,用于指定輸出格式2.普通字符或轉(zhuǎn)義序列:原樣輸出格式字符dx,Xoucse,Efg%%十六進(jìn)制無符號(hào)整數(shù)不帶符號(hào)十進(jìn)制整數(shù)十進(jìn)制整數(shù)指數(shù)形式浮點(diǎn)小數(shù)單一字符字符串八進(jìn)制無符號(hào)整數(shù)小數(shù)形式浮點(diǎn)小數(shù)e和f中較短一種百分號(hào)本身inta=567;printf(“%d”,a);inta=255;printf(“%x”,a);inta=65;printf(“%o”,a);inta=567;printf(“%u”,a);chara=65;printf(“%c”,a);printf(“%s”,“ABC”);floata=567.789;printf(“%e”,a);floata=567.789;printf(“%f”,a);floata=567.789;printf(“%g”,a);printf(“%%”);567ff101567AABC5.677890e+02567.789000567.789%說明 格式字符要用小寫格式字符與輸出項(xiàng)個(gè)數(shù)應(yīng)相同,按先后順序一一對(duì)應(yīng)格式字符與輸出項(xiàng)類型不一致,自動(dòng)按指定格式輸出表格格式:scanf(“格式控制串”,地址表)功能:按指定格式從鍵盤讀入數(shù)據(jù),存入地址表指定的存儲(chǔ)單元中,并按回車鍵結(jié)束返值:正常,返回輸入數(shù)據(jù)個(gè)數(shù)地址表:變量的地址,常用取地址運(yùn)算符&格式字符:d,i,o,x,u,c,s,f,e例scanf(“%d”,&a);

輸入:10

則a=10例scanf(“%x”,&a);

輸入:11

則a=17格式輸入函數(shù)

語句塊(Block){}括住的若干條語句構(gòu)成一個(gè)語句塊語句塊內(nèi)可以定義變量變量必須在語句塊的開頭定義變量僅在定義它的語句塊內(nèi)(包括下層語句塊)有效(scope.c)同一個(gè)語句塊內(nèi)的變量不可同名,不同語句塊可以同名(homonym.c)各司其職、下層優(yōu)先盡量不要在下層語句塊內(nèi)定義變量,也盡量不要定義同名變量語句塊可以用在任何可以使用語句的地方,但沒有道理要亂加語句塊if-else選擇結(jié)構(gòu)的一種最常用形式if(表達(dá)式)

語句塊1;

else

語句塊2;

語句塊3表達(dá)式值非0時(shí),執(zhí)行語句塊1,然后語句塊3;

表達(dá)式值為0時(shí),執(zhí)行語句塊2,然后語句塊3else部分可以沒有。當(dāng)表達(dá)式值為0時(shí),直接執(zhí)行語句3if-else嵌套使用時(shí),注意else和誰配套的問題表達(dá)式!=0?YN語句塊1語句塊2語句塊3else-ifif的一種擴(kuò)展if(表達(dá)式1)

語句塊1;

elseif(表達(dá)式2)

語句塊2;

elseif(表達(dá)式3)

語句塊3;

…………

else

語句塊4;

語句塊5;else部分可以沒有表達(dá)式1!=0?YN語句塊1語句塊2語句塊5表達(dá)式2!=0?表達(dá)式3!=0?語句塊3N語句塊4NYYswitch多路選擇switch(表達(dá)式){

case整型常數(shù)1:

語句1;

case整型常數(shù)2:

語句2;

…………

default:

語句3;

}default可以沒有不要忘記break說明:1.switch結(jié)構(gòu)的執(zhí)行部分是一個(gè)由一些case子句和一個(gè)可缺省的default子句組成的復(fù)合語句,特別注意要用一對(duì)“{}”括起來。2.switch后面的表達(dá)式一般是整型表達(dá)式或字符型表達(dá)式,與之相對(duì)應(yīng)的case后面的常量表達(dá)式也應(yīng)是一個(gè)整型表達(dá)式或字符型表達(dá)式,但要注意case與常量表達(dá)式之間要有空格。例如:case6+9:printf(“ok”);是合法的。3.在執(zhí)行switch語句時(shí),根據(jù)其后表達(dá)式的值找相匹配的case子句,要注意“case常量表達(dá)式”只是起語句標(biāo)號(hào)的作用,并不是在該處進(jìn)行條件判斷。當(dāng)找到相匹配的case子句即入口標(biāo)號(hào)時(shí),就從此標(biāo)號(hào)開始執(zhí)行后面的語句。因此,應(yīng)該在執(zhí)行一個(gè)case子句后必須增加一條間斷語句break來使流程跳出switch結(jié)構(gòu)。如果未找到相匹配的case子句就執(zhí)行default子句,若default子句放在最后其后可以不加break語句。4.各個(gè)case子句出現(xiàn)的次序?qū)?zhí)行結(jié)果沒任何影響,即順序可以任意布局。5.每一個(gè)case能夠擁有一條或多條語句,其最大的不同之處在于使用多條語句時(shí)不需要用“{}”括起來。6.多個(gè)case可以共用一組執(zhí)行語句。例如:┆case‘A’:case‘a(chǎn)’:++count;break;┆成績?yōu)榇髮懽帜窤或小寫字母a都進(jìn)行累加求和。7.switch結(jié)構(gòu)中的case子句中的常量表達(dá)式的值不允許相同。8.switch結(jié)構(gòu)允許嵌套。輸入一個(gè)字符,若是小寫字母就輸出對(duì)應(yīng)的大寫字母,若是大寫字母就輸出對(duì)應(yīng)的小寫字母,如果其它字符,則輸出錯(cuò)誤提示。main(){charx;printf("Input:");;if(x>='A'&&x<='Z')printf("\n%c",x+32);elseif(_______________________)printf("\n%c",x-32);elseprintf("InputError");}scanf("%c",&x);x>='a'&&x<='z'whilewhile(表達(dá)式)

語句塊1;

語句塊2;只要表達(dá)式的值為非0,就重復(fù)執(zhí)行語句塊1,直到表達(dá)式值為0時(shí)止,開始執(zhí)行語句塊2表達(dá)式!=0?YN語句塊1語句塊2forfor(表達(dá)式1;表達(dá)式2;表達(dá)式3)

語句塊;首先執(zhí)行表達(dá)式1。如果表達(dá)式2的值為非0,就重復(fù)執(zhí)行語句塊和表達(dá)式3,直到表達(dá)式2的值為0時(shí)止相當(dāng)于:

表達(dá)式1;

while(表達(dá)式2){

語句塊;

表達(dá)式3;

}for的所有表達(dá)式均可省略表達(dá)式2!=0?YN語句塊表達(dá)式3表達(dá)式1注意在for和while語句之后一般沒有分號(hào)有分號(hào)表示循環(huán)體就是分號(hào)之前的內(nèi)容,即循環(huán)體不存在while(i<100);

i++;for(i=0;i<100;i++);

printf("%d",i);for通常有一個(gè)循環(huán)變量控制循環(huán)的次數(shù),不要在循環(huán)體內(nèi)改變這個(gè)變量循環(huán)——do-whiledo

語句塊1;

while(表達(dá)式);

語句塊2;首先執(zhí)行語句,然后判斷表達(dá)式的值。如果表達(dá)式為0,繼續(xù)向下執(zhí)行,否則,再次執(zhí)行語句,再次判斷表達(dá)式的值語句塊1會(huì)被執(zhí)行至少一次表達(dá)式!=0?YN語句塊1語句塊2break和continue對(duì)for、while、do-while循環(huán)進(jìn)行內(nèi)部手術(shù)break,退出循環(huán)continue,中斷此次循環(huán)的執(zhí)行,開始下一次break和continue少用為妙它們?cè)黾恿搜h(huán)執(zhí)行的分支,break更增加了循環(huán)的出口它們可以用來處理程序異常,而盡量不要用來處理正常流程若intx=4,y=6,z=0;有循環(huán)while(x=y){z++;y--;}則循環(huán)語句執(zhí)行完后,z值為

。6判斷題:1.標(biāo)準(zhǔn)C中,并不區(qū)分英文字符的大小寫。2.表達(dá)式“ELSE”是合法的C語言標(biāo)識(shí)符。錯(cuò)對(duì)若一自然數(shù)全部正整數(shù)因子(該因子不包括其本身)之和仍為該自然數(shù),則該自然數(shù)稱為完全數(shù)。如:6=1+2+3,則6是完全數(shù)。求[2,1000]以內(nèi)的所有完全數(shù)。main(){intx,n,m;for(n=2;n<=1000;n++){

;

for(m=1;m<n;m++){if(n%m==0)x=x+m;}

;

printf(“%d\n”,n);}}x=0;if(x==n)函數(shù)為實(shí)現(xiàn)一個(gè)特定的目的而編寫的一個(gè)可被調(diào)用的的方法或過程在C程序設(shè)計(jì)中,通常將一個(gè)較大程序分成幾個(gè)功能較為單一的子程序模塊,用函數(shù)來完成每個(gè)子程序的作用。C語言是函數(shù)驅(qū)動(dòng)語言,C程序都由一個(gè)或多個(gè)函數(shù)構(gòu)成,其中有且只有一個(gè)名為main的函數(shù),即主函數(shù),C程序總是從main函數(shù)開始執(zhí)行并最后在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。函數(shù)的作用

使程序變得更加易讀、便于理解

節(jié)約空間、提高性能

提高可移植性

便于實(shí)現(xiàn)模塊化設(shè)計(jì)

。。。函數(shù)常識(shí)1、功能模塊:求解較小問題的算法和程序稱作“功能模塊”,各功能模塊可以先單獨(dú)設(shè)計(jì),然后將求解所有子問題的模塊組合成求解原問題的程序。2、一個(gè)解決大問題的程序,可以分解成多個(gè)解決小問題的模塊,這就是“自頂向下”的模塊化程序設(shè)計(jì)方法。3、用一個(gè)或多個(gè)函數(shù)來實(shí)現(xiàn)這些功能模塊。注意:(1)函數(shù)名和形式參數(shù)都是用戶命名的標(biāo)識(shí)符。在同一程序中,函數(shù)名必須唯一;形式參數(shù)只要在同一函數(shù)中唯一即可,可以與其它函數(shù)中的變量同名。(2)C語言規(guī)定,不能在一個(gè)函數(shù)的內(nèi)部再定義函數(shù)。(3)對(duì)函數(shù)類型的說明,必須與return語句中返回值表達(dá)式的類型一致。如果不一致,則以函數(shù)類型為準(zhǔn),由系統(tǒng)自動(dòng)進(jìn)行轉(zhuǎn)換。如果缺省函數(shù)類型,則系統(tǒng)一律按int類型處理。注意:(4)空函數(shù)──既無參數(shù)、函數(shù)體又為空的函數(shù)。其一般形式為:[函數(shù)類型]函數(shù)名(void){}如:dump(){}(5)帶參數(shù)的形式參數(shù)表中類型和變量必須成對(duì)出現(xiàn),如下面的定義是錯(cuò)誤的:doubleadd(doublex,y)函數(shù)的定義函數(shù)定義的一般形式函數(shù)返回值的數(shù)據(jù)類型函數(shù)名(類型名變量名1,類型名變量名2,……){

聲明部分處理語句

}【注意】函數(shù)名、一對(duì)圓括號(hào)不能省略類型標(biāo)識(shí)符形參表6.2.2函數(shù)的返回值C語言的函數(shù)兼有其它語言中的函數(shù)和過程兩種功能,從這個(gè)角度看,又可把函數(shù)分為有返回值函數(shù)和無返回值函數(shù)兩種。函數(shù)返回到函數(shù)調(diào)用點(diǎn):執(zhí)行到函數(shù)結(jié)束的右花括號(hào)}時(shí)(如果函數(shù)沒有返回值);執(zhí)行到如下語句:

return[表達(dá)式];形式:return;return(x);return(x+y);return(x>y?x:y);函數(shù)可根據(jù)需要出現(xiàn)個(gè)return語句(1)如果函數(shù)值類型與return語句表達(dá)式值的類型不一致,以函數(shù)類型為準(zhǔn)(數(shù)值型會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換)(2)聲明為void型的函數(shù)中不能包括帶值的return語句;主函數(shù)體內(nèi)不能出現(xiàn)return語句。注意:注意:(3)當(dāng)函數(shù)沒有return語句時(shí),以結(jié)束函數(shù)的大括號(hào)}作為返回點(diǎn)。但這時(shí)并不表明函數(shù)沒有返回值,這時(shí)的返回值是系統(tǒng)給的不確定值。(4)除了空值函數(shù)以外的所有函數(shù)都返回一個(gè)值,那么我們是不是非得去使用這個(gè)返回值呢?答案是否定的。如果沒有用它賦值,那它就被丟棄了。(5)在同一函數(shù)內(nèi),可用根據(jù)需要在多處出現(xiàn)return語句,但函數(shù)第一次遇到return時(shí)就立即停止執(zhí)行,并返回到主調(diào)函數(shù)函數(shù)的調(diào)用形式參數(shù):在定義函數(shù)時(shí)函數(shù)名后面括弧中的變量名,簡(jiǎn)稱形參實(shí)際參數(shù):在調(diào)用函數(shù)時(shí)函數(shù)名后面括弧中的表達(dá)式,簡(jiǎn)稱實(shí)參調(diào)用格式:函數(shù)名(實(shí)參表列)說明:實(shí)參必須有確定的值形參必須指定類型形參與實(shí)參類型一致,個(gè)數(shù)相同若形參與實(shí)參類型不一致,自動(dòng)按形參類型轉(zhuǎn)換———函數(shù)調(diào)用轉(zhuǎn)換形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時(shí)為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放函數(shù)參數(shù)及其傳遞方式值傳遞方式方式:函數(shù)調(diào)用時(shí),為形參分配單元,并將實(shí)參的值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實(shí)參單元仍保留并維持原值,形參作域只限函數(shù)內(nèi)特點(diǎn):形參與實(shí)參占用不同的內(nèi)存單元單向傳遞參數(shù)傳遞方式方式:函數(shù)調(diào)用時(shí),將數(shù)據(jù)的存儲(chǔ)地址作為參數(shù)傳遞給形參特點(diǎn):形參與實(shí)參占用同樣的存儲(chǔ)單元“雙向”傳遞實(shí)參和形參必須是地址常量或變量函數(shù)的地址傳遞

遞歸調(diào)用

函數(shù)在它的函數(shù)體內(nèi)調(diào)用自己,以實(shí)現(xiàn)層次數(shù)據(jù)結(jié)構(gòu)的查詢和訪問

使用遞歸的條件:1一個(gè)問題可以逐步解決,并且每一步的解決方法一樣,只是問題的參數(shù)有規(guī)律的變化2有一個(gè)明確的結(jié)束遞歸的條件優(yōu)點(diǎn):遞歸的使用可以使代碼更簡(jiǎn)潔清晰,可讀性更好缺點(diǎn):由于遞歸需要系統(tǒng)堆棧,所以空間消耗要比非遞歸代碼要大很多,而且,如果遞歸深度太大,可能系統(tǒng)資源會(huì)不夠用方便了程序員難為了機(jī)器

所有的遞歸函數(shù)都可以轉(zhuǎn)換為迭代函數(shù),反之亦然

概述變量是對(duì)程序中數(shù)據(jù)的存儲(chǔ)空間的抽象內(nèi)存…….main(){inta;a=10;printf(“%d\n”,a);printf(“%d\n”,&a)}編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元1020002001程序中使用變量名對(duì)內(nèi)存操作6.6變量的存儲(chǔ)屬性6.6.1變量的作用域與生存期C語言中變量必須先定義后使用,變量的數(shù)據(jù)類型決定了計(jì)算機(jī)為變量預(yù)留多少存儲(chǔ)空間以及該變量上應(yīng)具有的一組運(yùn)算。C語言中,除了對(duì)變量進(jìn)行數(shù)據(jù)類型說明,還可以說明變量的存儲(chǔ)類型。不同的存儲(chǔ)類型可以確定一個(gè)變量的作用域和生存期。變量的存儲(chǔ)類型1.變量的作用域

變量的作用域是指變量的作用范圍,在C語言中分為在全局有效、局部有效和復(fù)合語句內(nèi)有效三種。C語言中所有的變量都有自己的作用域。變量說明的位置不同,其作用域也不同,據(jù)此可將C語言中的變量分為局部變量(內(nèi)部變量)和全局變量(外部變量)。2.生存期變量的生存期是指變量作用時(shí)間的長短,在C語言中分為程序期、函數(shù)期和復(fù)合期三種。變量的屬性數(shù)據(jù)類型:變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性)存儲(chǔ)屬性存儲(chǔ)器類型:寄存器、靜態(tài)存儲(chǔ)區(qū)、動(dòng)態(tài)存儲(chǔ)區(qū)生存期:變量在某一時(shí)刻存在-------靜態(tài)變量與動(dòng)態(tài)變量作用域:變量在某區(qū)域內(nèi)有效-------局部變量與全局變量變量的存儲(chǔ)類型auto-----自動(dòng)型register-----寄存器型static------靜態(tài)型extern-----外部型變量定義格式:[存儲(chǔ)類型]數(shù)據(jù)類型變量表;

數(shù)據(jù)類型

[存儲(chǔ)類型]變量表;staticintx,y;局部變量定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效說明:main中定義的變量只在main中有效不同函數(shù)中同名變量,占不同內(nèi)存單元形參屬于局部變量可定義在復(fù)合語句中有效的變量局部變量可用存儲(chǔ)類型:autoregisterstatic(默認(rèn)為auto)#include<stdio.h>main(){intTest_Var=1;

{intTest_Var=2;

{intTest_Var=3;printf(“%d\n”,Test_Var);}//*?*printf(“%d\n”,Test_Var);}//*?*printf(“%d\n”,Test_Var);}//*1*1.自動(dòng)變量★在函數(shù)內(nèi)部或復(fù)合語句內(nèi)部定義的變量,如果沒有寫明存儲(chǔ)類,或使用了auto說明符,系統(tǒng)就認(rèn)為所定義的變量具有自動(dòng)變量類別,有時(shí)也稱(動(dòng)態(tài))局部變量?!镄螀儆诒徽{(diào)用函數(shù)的局部變量。注意:形參缺省的關(guān)鍵字是auto,但不能將auto直接加在形參之前。★自動(dòng)變量的初始化是:每一次調(diào)用,形參都以實(shí)參為初值,非形參的自動(dòng)變量在函數(shù)體內(nèi)部或復(fù)合語句內(nèi)部都重新賦初值。所以,未賦初值的自動(dòng)變量,“無定義”,其值不定。3.靜態(tài)局部變量在函數(shù)體(或復(fù)合語句)內(nèi)部,用以下定義格式定義的變量稱為靜態(tài)局部變量:static數(shù)據(jù)類型變量表;例如:staticinta=8;靜態(tài)局部變量的初始化只在編譯時(shí)進(jìn)行一次,每次調(diào)用它們所在的函數(shù)時(shí),不再重新賦初值,只是保留上次調(diào)用結(jié)束時(shí)的值。若定義但不初始化,則自動(dòng)賦以"0"(數(shù)值型)或'\0'(字符型)。例6.18求下列程序的輸出結(jié)果#include<stdio.h>main(){ intf(void);/*函數(shù)聲明*/ intj; for(j=0;j<3;j++) printf("%d\n",f());}intf(void)/*無參函數(shù)*/{ staticintx=1; x++; returnx;}程序運(yùn)行結(jié)果:234例:分析執(zhí)行結(jié)果f(inta){intb=0;staticintc=3;b++;c++;printf(“%5d%5d%5d”,a,b,c);return(a+b+c);}main(){inta=2,k;for(k=0;k<3;k++)printf(“%5d\n”,f(a));}靜態(tài)變量只初始化一次結(jié)果:214(a,b,c)7(f(a))215821692.靜態(tài)全局變量★當(dāng)用static說明符說明全局變量時(shí),此變量就稱為靜態(tài)全局變量或靜態(tài)外部變量?!锎藭r(shí)static的作用不是把全局變量改為靜態(tài)存儲(chǔ),因?yàn)樗旧砭褪庆o態(tài)存儲(chǔ)類,而是限制了它的作用域只能在本文件內(nèi),不能用extern說明符使其作用域擴(kuò)展到程序的其它文件中?!镬o態(tài)外部變量允許程序的一部分對(duì)其它部分充分隱蔽,這有利于管理大型復(fù)雜程序,程序員不必?fù)?dān)心因全局變量重名而引起混亂。靜態(tài)動(dòng)態(tài)存儲(chǔ)方式程序整個(gè)運(yùn)行期間函數(shù)調(diào)用開始至結(jié)束生存期編譯時(shí)賦初值,只賦一次每次函數(shù)調(diào)用時(shí)賦初值自動(dòng)賦初值0或空字符不確定未賦初值靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)區(qū)存儲(chǔ)區(qū)寄存器局部變量外部變量作用域定義變量的函數(shù)或復(fù)合語句內(nèi)本文件其它文件局部變量默認(rèn)為auto型register型變量個(gè)數(shù)受限,且不能為long,double,float型局部static變量具有全局壽命和局部可見性局部static變量具有可繼承性extern不是變量定義,可擴(kuò)展外部變量作用域register局部staticauto外部static外部存儲(chǔ)類別變量存儲(chǔ)類型找出2個(gè)錯(cuò)誤用遞歸語句編函數(shù)計(jì)算10!longf(intm){longa;if(m<0)printf(“dataerror!”);elsea=f(m-1)*m;}main(){intn;n=10;printf(“%d!=%ld”,n,f(n));}if(m==0)a=1;return(a);用遞歸語句編函數(shù)計(jì)算6!longf(intm){longa;if(m<0)printf(“dataerror!”);elsea=f(m-1)*m;}main(){intn=6;printf(“%d!=%ld”,n,f(n));}if(m==0)a=1;return(a);#include<stdio.h>inti=0;main(){intk=1;i++;k++;printf(“goodi=%d,k=%d\n”,i,k);sub();sub();}staticinty=0;sub(){intk=0;staticintx=1;y++;k++;x++;printf(“badi=%d,k=%d,x=%d,y=%d\n”,i,k,x,y);}goodi=1,k=2badi=1,k=1,x=2,y=1badi=1,k=1,x=3,y=2一維數(shù)組的定義定義方式:數(shù)據(jù)類型數(shù)組名[常量表達(dá)式];

合法標(biāo)識(shí)符表示元素個(gè)數(shù)下標(biāo)從0開始[]:數(shù)組運(yùn)算符單目運(yùn)算符優(yōu)先級(jí)(1)左結(jié)合不能用()例

inta[6];a[0]0145a[1]a[2]a[3]a[4]a[5]23a編譯時(shí)分配連續(xù)內(nèi)存內(nèi)存字節(jié)數(shù)=數(shù)組維數(shù)*

sizeof(元素?cái)?shù)據(jù)類型)數(shù)組名表示內(nèi)存首地址,是地址常量

一維數(shù)組

……..

4的高位字節(jié)4的低位字節(jié)2的高位字節(jié)2的低位字節(jié)20002002200420062008a[0]a[1]a[2]a[3]a[4]數(shù)組在內(nèi)存中的首地址即a=2000inta[5]={2,4,23,6,78};二維數(shù)組的定義定義方式:

數(shù)據(jù)類型數(shù)組名[常量表達(dá)式][常量表達(dá)式];數(shù)組元素的存放順序原因:內(nèi)存是一維的二維數(shù)組:按行序優(yōu)先多維數(shù)組:最右下標(biāo)變化最快例inta[3][4];floatb[2][5];intc[2][3][4];

inta[3,4];(

)行數(shù)列數(shù)元素個(gè)數(shù)=行數(shù)*列數(shù)inta[3][2]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]014523a[0][0]a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]intc[2][3][4]01234567………...20212223c[0][0][0]c[0][0][1]c[0][0][2]c[0][0][3]c[0][1][0]c[0][1][1]c[0][1][2]c[0][1][3]c[0][2][0]c[0][2][1]c[0][2][2]c[0][2][3]c[1][0][0]c[1][0][1]c[1][0][2]c[1][0][3]c[1][1][0]c[1][1][1]c[1][1][2]c[1][1][3]c[1][2][0]c[1][2][1]c[1][2][2]c[1][2][3]二維數(shù)組及多維數(shù)組引用

a[i][j](i:0~N-1,j:0~M-1)

初始化

inta[2][3]={{1,2,3},{4,5,6}};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]123456分行全部賦初值例

inta[2][3]={1,2,3,4,5,6};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]123456全部元素賦初值例

inta[][3]={1,2,3,4,5};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]123450全部元素賦初值第一維可省例

inta[2][3]={1,2,4};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]124000部分元素賦初值例

inta[][3]={{1},{4,5}};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]100450賦初值時(shí)指定維數(shù)第一維可以省略例

inta[2][3]={{1,2},{4}};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]120400分行部分賦值

字符數(shù)組

定義:

初始化

逐個(gè)字符賦給數(shù)組中的元素;

利用字符串常量.例charc[10],ch[3][4];例

charch[6]={"Hello"};charch[6]="Hello";charch[]="Hello";字符串常量初始化ch[0]Helloch[1]ch[2]ch[3]ch[4]\0ch[5]

charch[5]="Boy";ch[0]Boy\0\0字符串常量初始化ch[1]ch[2]ch[3]ch[4]

charch[5]={'B','o','y'};ch[0]Boy\0\0逐個(gè)字符初始化ch[1]ch[2]ch[3]ch[4]例

charch[5]={'H','e','l','l','o'};ch[0]Hello逐個(gè)字符初始化ch[1]ch[2]ch[3]ch[4]例

chardiamond[][5]={{'.','.','*'},{'.','*','.','*'}, {'*','.','.','.','*'},{'.','*','.','*'},{'.','.','*'}};二維數(shù)組初始化..*\0\0.*.*\0*...*.*.*\0..*\0\0diamond[0]diamond[1]diamond[2]diamond[3]diamond[4]

charfruit[][7]={"Apple","Orange","Grape","Pear","Peach"};二維數(shù)組初始化fruit[0]fruit[1]fruit[2]fruit[3]fruit[4]Apple\0\0Orange\0Grape\0\0Pear\0\0\0Peach\0\0

字符串:

沒有字符串變量,字符串用字符數(shù)組來處理

;一個(gè)字符串用\0作結(jié)束標(biāo)志。

(或空字符)例“hello”有5

個(gè)字符,存儲(chǔ)在6

個(gè)字符的字符數(shù)組中。

chara[]=“hello”

hello\0輸入輸出字符串

字符的輸入/輸出:%c

字符串的輸入/輸出:%s例

使用%c

main(){charstr[5];inti;for(i=0;i<5;i++)scanf(“%c”,&str[i]);for(i=0;i<5;i++)printf(“%c”,str[i]);}例使用%smain(){charstr[5];scanf(“%s”,str);printf(“%s”,str);}使用數(shù)組名,不需使用地址運(yùn)算符

&輸入字符串的長度<

數(shù)組的長度用空格或換行結(jié)束輸入自動(dòng)添加結(jié)束符‘\0’使用數(shù)組名用‘\0’標(biāo)志字符串的結(jié)束字符串處理函數(shù)

puts(字符數(shù)組名)stdio.h

puts輸出字符串,可以包含轉(zhuǎn)義字符;

字符數(shù)組必須具有字符串結(jié)束標(biāo)記‘\0’

gets(字符數(shù)組名)stdio.h

gets輸入一個(gè)字符串到字符數(shù)組,換行表示輸入字符串結(jié)束;

自動(dòng)在輸入字符串后加入結(jié)束標(biāo)志‘\0’;

字符串長<=數(shù)組長度函數(shù)的返回值是數(shù)組的首地址,一般不關(guān)心。只輸入一個(gè)字符串。例

#include<stdio.h>main(){charstring[80];printf("Inputastring:");gets(string);puts(string);}input:Howareyou?output:Howareyou?

strcat(字符數(shù)組名1,字符數(shù)組名2)string.h

將字符數(shù)組2

連接到字符數(shù)組1的后面,連接時(shí)自動(dòng)取消字符數(shù)組1后面的結(jié)束標(biāo)志;

結(jié)果存放到字符數(shù)組1中,函數(shù)返回值是字符數(shù)組1

的首地址;

字符數(shù)組1要有足夠的空間存放結(jié)果;

strcpy(字符數(shù)組1,字符串2)string.h

將字符串2

復(fù)制到字符數(shù)組1,包括'\0';

字符數(shù)組1

必須有足夠的空間存放結(jié)果;字符串2可以是數(shù)組名??梢詫⒆址?前面的若干個(gè)字符賦值到字符數(shù)組1中去。不能用賦值語句將一個(gè)字符串賦值給字符數(shù)組例

charstr1[20],str2[20];str1={"Hello!"};(

)str2=str1;(

)例:strcpy和strcat#include<string.h>#include<stdio.h>main(){chardestination[25];charblank[]="",c[]="C++",turbo[]="Turbo";

strcpy(destination,turbo);

strcat(destination,blank);strcat(destination,c);printf("%s\n",destination);}TurboC++TrboC++0123456789u\024…….Trbo0123456789u\024…….…….Trbo\00123456789u24…….…...

strcmp(字符串1,字符串2)string.h

用字符的ASCII值逐個(gè)對(duì)應(yīng)比較字符串1

與字符串2字符的大小(left-to-right);if字符串1<

字符串2,返回<0;if字符串1==字符串2,返回=0;if字符串1>字符串2,返回>0;

不能用==

去直接比較兩個(gè)字符串的大小.

strlen(字符數(shù)組)string.h

返回字符串的長度;

函數(shù)的值是字符串的實(shí)際長度,不包括

‘\0’.例

strlen(s)的結(jié)果:(1)chars[10]={'A','\0','B','C','\0','D'};結(jié)果:1已知矩陣a=,求該矩陣對(duì)角線元素之和。main(){inti;inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};for(i=1;i<=3;i++)sum=sum+[i][i];printf(“sum=%d”,sum);}

intsum=0;for(i=0;i<3;i++)已知質(zhì)數(shù)的定義是:若某一正整數(shù)只有1和它本身兩個(gè)因子,則這個(gè)正整數(shù)稱為質(zhì)數(shù)。例如13只有1和13兩個(gè)因子,則13為質(zhì)數(shù)。數(shù)學(xué)上規(guī)定1不是質(zhì)數(shù)。若整數(shù)A是整數(shù)B的因子,且整數(shù)A是質(zhì)數(shù),則稱A是B的質(zhì)因子。例如整數(shù)36的質(zhì)因子為2,3。編寫程序求整數(shù)12903的最大質(zhì)因子。f(intx){inti;

①for(

;i<x;i++)if(x%i==0){k=2;break;}return(k);}main(){intn=12903,b,a;for(a=2;a<n;a++)if((f(a)==1)&&(n%a==0))

③printf(“theansweris%d\n”,b);}intk=1i=2b=a;

指針變量定義

定義指針變量的一般形式為基類型*指針變量名指針變量與普通變量類似,在程序中若要使用指針變量,必須先進(jìn)行定義后使用。例如:int*p1,i;(定義p1為指向整型變量的指針變量)char*p2,c;(定義p2為指向字符型變量的指針變量)float*p3,f;(定義p3為指向?qū)嵭妥兞康闹羔樧兞浚﹊nt、char、float分別稱為指針變量p1、p2、p3的“基類型”,…...…...2000200420062005整型變量i10變量i_pointer200120022003指針與指針變量的區(qū)別?指針:一個(gè)變量的地址指針變量:專門存放變量地址的變量叫~2000指針指針變量

變量的內(nèi)容

變量的地址指針變量變量變量地址(指針)變量值指向地址存入指針變量&與*運(yùn)算符含義含義:取變量的地址單目運(yùn)算符結(jié)合性:自右向左含義:

取指針?biāo)赶蜃兞康膬?nèi)容單目運(yùn)算符結(jié)合性:自右向左兩者關(guān)系:互為逆運(yùn)算理解…...…...2000200420062005整型變量i10變量i_pointer2001200220032000指針變量i_pointer-----指針變量,它的內(nèi)容是地址量*i_pointer----指針的目標(biāo)變量,它的內(nèi)容是數(shù)據(jù)&i_pointer---指針變量占用內(nèi)存的地址200010i_pointer*i_pointer&i_pointerii_pointer&i&(*i_pointer)i*i_pointer*(&i)i_pointer

=

&i

=

&(*i_pointer)i

=

*i_pointer

=

*(&i)直接訪問與間接訪問直接訪問:按變量地址存取變量值間接訪問:通過存放變量地址的變量去訪問變量例

i=3;-----直接訪問指針變量…...…...2000200420062005整型變量i10變量i_pointer20012002200320003例*i_pointer=20;-----間接訪問20指針變量…...…...2000200420062005整型變量i10變量i_pointer2001200220032000整型變量k例

k=i;--直接訪問

k=*i_pointer;--間接訪問10例

k=i;k=*i_pointer;指針變量賦值(初始化)

1.通過取地址運(yùn)算符(&)獲得地址值如下定義和賦值:inta=5,*p,*q;p=&a;它建立了如圖所示的邏輯關(guān)系pa&a5因此當(dāng)有語句:p=&a;時(shí),scanf(″%d″,&a);和scanf(″%d″,p)是等價(jià)的2.通過指針變量獲得地址值

可以通過賦值運(yùn)算,把一個(gè)指針變量中的地址值賦給另一個(gè)指針變量,從而使這兩個(gè)指針變量指向同一地址

q=p;

使指針變量q中也存放了變量a的地址,也就是說指針變量p和q都指向了整型變量a

賦值號(hào)兩邊指針變量的基類型必須相同paq&a5&a3.給指針變量賦“空”值

p=NULL;p=0;NULL的代碼值為0,應(yīng)當(dāng)注意:

1.指針變量只能存放地址,不能把一個(gè)整型量賦給指針變量

p=5;×應(yīng)該通過取地址運(yùn)算符“&”把一個(gè)地址賦給指針變量。

2.應(yīng)避免使用沒有賦值的指針變量,沒有賦值的指針變量雖不會(huì)導(dǎo)致編譯出錯(cuò),但可能導(dǎo)致無法預(yù)料的災(zāi)難性后果注意:1)

指針變量數(shù)據(jù)類型必須與所賦值的變量類型一致,例如以下語句是非法的。floaty;int*p;p=&y;因?yàn)椋馂檎椭羔樧兞?,y為實(shí)型變量,類型不一致,故為p=&y;是非法語句。2)

不允許把一個(gè)數(shù)(常量)賦予指針變量,故下面的賦值是錯(cuò)誤的。int*p;p=1000;3)

被賦值的指針變量前不能再加“*”說明符,如寫為*p=&a也是錯(cuò)誤的。但對(duì)于在定義指針的同時(shí)賦值是允許的,如:int*p=&a;其實(shí)質(zhì)可分解為兩句,即:int*p;p=&a;4)

可以將指針變量初始化為空值NULL。如:p=NULL;為進(jìn)一步明確運(yùn)算符“&”和“*”的含義和作用,思考下面幾個(gè)問題:1)如果已經(jīng)執(zhí)行了p=&a;語句,則&*p的含義是什么?假設(shè)已經(jīng)執(zhí)行了p=&a;語句,則(*p)++相當(dāng)于a++,即將指針變量p所指示的變量的值加1。而*p++等價(jià)于*(p++),這時(shí)先將p的值加1,p不再指向a了,而是指向a所占用存儲(chǔ)區(qū)域的后續(xù)位置,再取其內(nèi)存值。2)如inti=5,*p;再執(zhí)行&*i運(yùn)算可不可以?由于運(yùn)算符“&”和“*”的優(yōu)先級(jí)相同,按自右而左的方向結(jié)合,因些進(jìn)行*p的運(yùn)算,即得到變量a的值,再執(zhí)行&運(yùn)算。因此,&*p與&a、p是等價(jià)的。即可以說“&”與“*”是互為反運(yùn)算。這是不允許的,因?yàn)閕只是一個(gè)整型變量,而不是指針變量,故根據(jù)自右而左的運(yùn)算*i是錯(cuò)誤的,*運(yùn)算符只能是對(duì)指針變量進(jìn)行運(yùn)算。3)(*p)++和*p++的區(qū)別是什么?數(shù)組元素表示方法a[0]a[1]a[2]a[3]a[9]...aa+9a+1a+2地址元素下標(biāo)法a[0]a[1]a[2]a[9]a[0]a[1]a[2]a[3]a[9]...pp+9p+1p+2地址元素指針法*p*(p+1)*(p+2)*(p+9)[]變址運(yùn)算符a[i]

*(a+i)a[i]

p[i]

*(p+i)

*(a+i)*a*(a+1)*(a+2)*(a+9)p[0]p[1]p[2]p[9]數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù),是地址傳遞數(shù)組名作函數(shù)參數(shù),實(shí)參與形參的對(duì)應(yīng)關(guān)系實(shí)參形參數(shù)組名指針變量數(shù)組名指針變量數(shù)組名數(shù)組名指針變量指針變量字符串與數(shù)組關(guān)系字符串用一維字符數(shù)組存放字符數(shù)組具有一維數(shù)組的所有特點(diǎn)數(shù)組名是指向數(shù)組首地址的地址常量數(shù)組元素的引用方法可用指針法和下標(biāo)法數(shù)組名作函數(shù)參數(shù)是地址傳遞等區(qū)別存儲(chǔ)格式:字符串結(jié)束標(biāo)志賦值方式與初始化輸入輸出方式:%s%ccharstr[]={"Hello!"};(

)charstr[]="Hello!";(

)charstr[]={'H','e','l','l','o','!'};(

)char*cp="Hello";(

)inta[]={1,2,3,4,5};(

)int*p={1,2,3,4,5};(

)charstr[10],*cp;inta[10],*p;str="Hello";(

)cp="Hello!";(

)a={1,2,3,4,5};(

)p={1,2,3,4,5};(

)scanf(“%s”,str);printf(“%s”,str);gets(str);puts(str);二維數(shù)組和指針變量指向數(shù)組元素的指針變量定義一個(gè)二維數(shù)組:inta[2][3]={1,2,3,4,5,6};二維數(shù)組元素在內(nèi)存中是按行存放的,對(duì)于上面的定義我們可以認(rèn)為a是數(shù)組名,數(shù)組包括2行即2個(gè)元素a[0],a[1]。每個(gè)元素又是一維數(shù)組,包含3個(gè)元素aa[0]a[1]123456a[0][2]*(a[0]+2)*(*(a+0)+2)指向指針的指針定義:指向指針的指針一級(jí)指針:指針變量中存放目標(biāo)變量的地址p1&p2&i3P2(指針變量)i(整型變量)例int**p1;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論