



版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
9月18日:C語言基礎(chǔ)—.C:XX.c(源文件)C++:XX.cpp(源文件)頭文件:XX.h庫文件:xx.dll目標(biāo)文件:xx.obj/XX.。(不可執(zhí)行)(由源文件經(jīng)過編譯生成)可執(zhí)行文件:XX.exe(在windows下)(由目標(biāo)文件經(jīng)過連接器生成)二.在編譯.鏈接和運(yùn)行程序中都有可能出現(xiàn)錯誤.錯誤分兩種:.編譯時錯誤(屬于語法錯誤).運(yùn)行時錯誤:a.邏輯錯誤(糾正方法:改源代碼,屬于可以及時組正的問題)b.其他錯誤(例如BUG)作業(yè):記住以下的代碼:#include<stdio.h>intmain(intargc.char*argv[])(printf("HelloWorld\nM);return0;另一段代碼(不需要強(qiáng)記):#include<stdio.h>intmain(intargc,char*argv[])inti=0;for(;i<argc;++i)|printf("%s,",argv[i]);}printf("\n");return0;}9月19日:數(shù)據(jù)類型和算數(shù)運(yùn)算進(jìn)制轉(zhuǎn)換:要熟悉各進(jìn)制之間相互的轉(zhuǎn)換.二進(jìn)制(0,1).ノ財(cái)制(0-7).十進(jìn)制(0-9).十六進(jìn)制(0-9,A-F)(1),十進(jìn)制轉(zhuǎn)二進(jìn)制:(31)10=(11111)2方法:31/2i上15余115/2i上7余17/2I上3余13/2J上1余1最后將所有的余數(shù)從下往坤モ列組合,開頭數(shù)字為最后一次運(yùn)算的商數(shù).(2).二進(jìn)制轉(zhuǎn)十進(jìn)制:(1O11OO11)2=(179)1o方法:10110011111II27り524り12。27+25+24+2 5 6 7 7+2°=128+32+16+2+1=179 5 6 7 7(3),二進(jìn)制換ノ?制:三位ー縮(1101110111111)=(15677)8方法:參照表1轉(zhuǎn)換00001001201030114100510161107111表1(001101110111111)注:由右往左開始,三位數(shù)一列,如果最后左邊剩下的數(shù)不夠3位,就自動+0直到滿3位數(shù)為止..ハ進(jìn)制轉(zhuǎn)二進(jìn)制:三位一展(1234)8=(1010011100)2方法:按照表1轉(zhuǎn)換12 3 41111001010011100.十六進(jìn)ニ:(1AFC)16=(11O1O111111OO)2方法:按照表2轉(zhuǎn)換00000A101010001B101120010c110030011D110140100E111050101F111160110701118100091001表2AFCIIII0001101011111100.二進(jìn)制換十六進(jìn)制:方法:按照表2轉(zhuǎn)換,類似ノva制換二進(jìn)制的方法.二.sizeof運(yùn)算:sizeof是一個單目運(yùn)算符,運(yùn)算返回變量或類型的字節(jié)長度,以字節(jié)為單位.TS的格式為:sizeof(<數(shù)據(jù)類型〉)sizeof(く變量名〉)sizeof(<常量〉)三.輸只符:.只能由字母數(shù)字和下劃線組成.開頭不能為數(shù)字.不能使用關(guān)鍵字.區(qū)分大〃與四.幾種類型的數(shù)據(jù)符號:整型數(shù)據(jù)%d以有符號十進(jìn)制形式輸出整型數(shù)一int%u以無符號十進(jìn)制形式輸出整型數(shù)一unsignedlongint實(shí)型數(shù)據(jù)%f以小數(shù)形式輸出實(shí)型數(shù)一float%e以指數(shù)形式輸出實(shí)型數(shù)字符型數(shù)據(jù)%c以單個字符形式輸出字符型數(shù)據(jù)一char%P以指針值形式輸出字符型數(shù)據(jù)X“%S”表示字符串五.ASCII碼:以十進(jìn)制顯示的以下面規(guī)律類推其他字母和數(shù)字'A'"*65'B'-66'C—67匕,-97'b'—98lc'—99,〇,—48 —49'2'-50六.熟記各種數(shù)據(jù)類型在內(nèi)存中的字節(jié)數(shù)和表示范圍:類型名稱字節(jié)表示范圍char字符型1-128—127unsignedchar無符號字符型10—255int整型4-231—(231-1)longint長整型4-231—(231-1)shortint短整型2-215—(215-1)unsignedint無符號整型40—65535unsignedlongint無符號長整型40—232-1unsignedshortint無符號短整型20—65535float單精度浮點(diǎn)型47—8位有臓字double雙精度浮點(diǎn)型815—17位有效數(shù)字A,'a','0'字符常量1任意22,0,-23整型常量J4任意七.格式化輸出printfprintf(“格式控制字符串”),表達(dá)式1,表達(dá)式2,.…表達(dá)式n);注:格式控制字符串的意思就是,想要以什么樣的形式來顯示或者說明表達(dá)式的結(jié)果,例printf("sizeof(int)=%d\n",sizeof(Bint"));printf("%d\n",sizeof(“int”));這兩者輸出的結(jié)果是ー樣的,都是查看int的字節(jié)數(shù),前者里的sizeof(int)=的這一段完全是為了使看結(jié)果時更清晰ー些所添加的,相當(dāng)于一種標(biāo)示.ハ?常量:其值不發(fā)生改變的量稱常量.類型:1.整型常量:22,0,-232.實(shí)型常量:14.26,-21.23.字符常量:,A「a'.字符串常量:“Beijing",“VC++6.0”九.雜項(xiàng):.浮點(diǎn)數(shù)無法保存到最精確的數(shù)據(jù),比如要保存1.5,用浮點(diǎn)保存就只能為大概1.499999的樣子,要保存最精確的數(shù)據(jù)只能用字符集..為什么int和longint都是4字節(jié)?答:因?yàn)橐郧笆?6位進(jìn)制的,int是2,到現(xiàn)在改變變成了32位進(jìn)制的,int變成了4,但|ongint并沒有改變..無符號系列的int只能存正數(shù),其他類型的可以存負(fù)數(shù)..無符號長整型能存最大整數(shù)..在命令printf(B%.Xf\n"J數(shù)字);中,“X”表示你想在小數(shù)點(diǎn)后取多少位(一般最大不超過16-17)6,直接輸入Printf("%d\n",'X')可以直接得到X的ASCII碼,X指任意數(shù)包括數(shù)字和大小寫字母.9月21日變量的使用變量名的定義及定義方式:.變量名都是由字母.數(shù)字和下劃線組成.(變量名就是ー種標(biāo)識符).要定義多項(xiàng)變量名的時候,要分開寫,例如想要定義Inta,b;的話,語法上雖然不會出錯,但會在以后摻入指針的時候產(chǎn)生疑問,需按規(guī)范寫成Inta=0;Intb=0;XintnAge=10如果10變成10.5或者10.9,也能編譯,但結(jié)果還是10,不存在四舍五入,這叫丟失精度,因?yàn)槭歉呶幌虻臀晦D(zhuǎn)(10.9占8字節(jié),比10的4字節(jié)高).變量的初始化:當(dāng)ー個變量被定義后,如果不給它賦值,那么它的值將是一個隨機(jī)值,在程序中使用的話會引起不可預(yù)知的錯誤.賦值的定義:變量被定義后給它ー個值就叫賦值..字符常量和整型數(shù)據(jù)間可以運(yùn)算;.字符常量和整型數(shù)據(jù)間可以互相賦值..轉(zhuǎn)義字符轉(zhuǎn)義字符轉(zhuǎn)義字符的意義\n回車換行L符\tTab制表符\b退格符\r回車符\\反斜線符“'”\'單引號符ヽ”雙引號符."\n"可以把“'r"覆蓋..getch()這個命令里,只接受“'r“不接受“'n”,這個函數(shù)的功能是隱式輸入..要輸入c:\a.txt的話,直接輸入會變成”c:.txt”,因?yàn)椤?a”會被默認(rèn)為是ー個轉(zhuǎn)義字符而無法實(shí)現(xiàn)輸出,需要輸入‘''a”才能實(shí)現(xiàn)輸入.注:同理理解”'”,“''”的運(yùn)用..退格符的使用:if('\b'==szlnput[j])(printf("\b'b");j=j-2;)四.符號常量一宏定義#define格式:#define符號常量常量例:#defineNUM20#definePI3.1415926注意:1.行尾不能加分號(即常量后面).宏名必須大寫(即符號常量必須大寫).宏的工作就是作簡單的字符串的替換,無其他任何作用.宏可以重復(fù)定義,編譯不會報(bào)錯,只以最后一次定義為準(zhǔn),如:#defineSIZE100#defineSIZE200替換的時候會換成200※以下是ー種#define的用法,不過一般不會這么用,原因是寫程序前已經(jīng)基本定好了是哪種數(shù)據(jù)類型的:#include<stdio.h>#defineSIZE100#defineTYPE"%d\n”intmain(intavgc,char*avgv[])(printf(TYPE,SIZE);return0;}5.面試題:已知一個數(shù)組為table,類型不知道,占用長度也不知道,問這個數(shù)組占用多少個字節(jié)?#defineLEN(sizeof(table)/sizeof(table[0]))五.注釋:.單行注釋:〃.多行注釋:/*被注釋后的內(nèi)容都會變成綠色,不會被編譯,可以在其中輸入任意內(nèi)容包括中文.多行注釋符號可被單行注釋符號注釋掉使其失效ー---“〃/*”六.零的意義:.整數(shù)零fmt(4字節(jié)).へO'—char(1字節(jié))へ?!腁SCII值為零.空值NULL,通常在指針操作.bool里的0—false.除了零之外的都叫非零值.所有的零值都是:假,所有的非零值都是:真(用于判斷)注:1).’〇’不是零因?yàn)樗腁SCII值是48..“〇”不是零,因?yàn)樗亲址?(以‘、?!Y(jié)束).七.const--ー不可修改的變量constintSIZE=100;const的對象名字全大寫.const的對象必須初始值.const的對象不能被賦值.const語句后必須加分號.錯例:.constintSIZE=100;SIZE=200/Z錯誤!原因:const對象不能被賦值.constintSIZE=100;SIZE=100 〃錯誤!!原因:不能被重復(fù)定義.#define和const的區(qū)別:①.前者是C語言的,后者是C++的②.前者定義的符號常量是無類型的,只能作簡單的替換后者有類型,會作類型檢査(編譯時)③.前者可以重復(fù)定義,后者不行④.前者不能加分號,后者必須加分號9月22日算數(shù)運(yùn)算符和算數(shù)表達(dá)式運(yùn)算符種類:包括加(+)、減(-)、乘(*)、除(/)、求余(或稱模運(yùn)算:%).加(+)、減(-)、乘(*)就是通常用到的加減乘法運(yùn)算..除(/):若整數(shù)相除,結(jié)果取整,如:5/2=2如果運(yùn)算中除數(shù)和被除數(shù)中的其ー為浮點(diǎn)數(shù),則結(jié)果為浮點(diǎn)數(shù),如:5.0/2=2.5 5/2.0=2.55.0/2.0=2.5.求余(%):只能對整數(shù)運(yùn)算,不允許對浮點(diǎn)數(shù)運(yùn)算,沒有意義,因?yàn)楦↑c(diǎn)數(shù)沒有余數(shù),運(yùn)算結(jié)果的正負(fù)值與被除數(shù)相同,例:-5%2=-1-5%-2=-15%2=15%-2=12%5=2(特別注意:2除5上〇,余2)二.運(yùn)算符表達(dá)式:表達(dá)式是由操作符、操作數(shù)、標(biāo)點(diǎn)符號組成的序列.1.單目運(yùn)算:-5雙目運(yùn)算:a=5唯一的三目運(yùn)算:(a>b)?a:b(求最大值:如果a>b那么返回a的值,否則返回b的值,這是條件表達(dá)式)三.運(yùn)算符的優(yōu)先級及結(jié)合性:括號ー增減量一指針一正負(fù)ー邏輯非ー算數(shù)一關(guān)系ー邏輯ー條件ー賦值ー逗號.逗號運(yùn)算符:是以逗號最后ー個運(yùn)算的值為返回值,例:inta=10;intb=20;intc=0;c=a+3,b+5運(yùn)算結(jié)果返回值為25.運(yùn)算符的結(jié)合性:.左結(jié)合性:自左至右2),右結(jié)合性:自右至左(ヒ匕較少見)四.賦值運(yùn)算:ネ呈序中為變量賦值,需要用到賦值運(yùn)算符J",由“="連接的式子稱為賦值表達(dá)式,其一般形式為:變量=表達(dá)式,例:#include<stdio.h>intmain(intargc.char*argv[])(intnNumberA=0;intnNumberB=0;intnSum=0;printf(Hpleaseinputnumber:");scanf(M%dM,&nNumberA);printf(Mpleaseinputnumber2:M);scanf(u%dn,&nNumberB);nSum=nNumberA+nNumberB;printf(MnSnm=%d\nM,nSum);return0;}五.scant:.輸入格式:與printf是ー樣的.舉例:scanf("%d”,&nNumberA);.scanf("%d%d",&a,&b)〃輸入方式為:①10空格20②10回車20※如果要輸入ー個數(shù)字和一個字符,就必須以(“%d,%c)的形式輸入.六.錯誤處理機(jī)制:意義:假如要求輸入整數(shù)的時候,輸入了非法字符后,會提示輸入出錯并清流,回到正常狀態(tài),使得接下來所輸入的內(nèi)容不受影響1.C語言中:#include<stdio.h>intnFlag=0;intmain(intargc.char*argv[])nFlag=scanf("%dn,&nNumberB);if(nFlag==O)printf(MlnputError...\nn);clearerr(stdin);fflush(stdin);)return0;}C++中:intnNumber=0;cin>>nNumber;if(cin.fail())(cin.clear();chartemp[1000];cin.getline(temp,1000);contvv"InputError..?<<end1;)七.類型轉(zhuǎn)換:.隱式類型轉(zhuǎn)換:發(fā)生在不同數(shù)據(jù)類型的量混合運(yùn)算時,由編譯系統(tǒng)自動完成.遵循以下規(guī)則:1),若參與運(yùn)算量的類型不同,則先轉(zhuǎn)換成同一類型,然后逬行運(yùn)算..轉(zhuǎn)換按數(shù)據(jù)長度增加的方向進(jìn)行,以保證精度不降低(低位向高位).所有的浮點(diǎn)運(yùn)算都是以雙精度進(jìn)行的,即使僅含float的表達(dá)式,也要樹換成double型,再作運(yùn)算..char和short參與運(yùn)算時,必須先轉(zhuǎn)換成int型..在賦值運(yùn)算中,賦值號兩邊量的數(shù)據(jù)類型不同時,賦值號右邊量的類型將轉(zhuǎn)換為左邊量的類型,如果右邊量的數(shù)據(jù)類型長度比左邊量長時,賦值操作將會丟失一部分?jǐn)?shù)據(jù),精度降<氐.2.顯式類型轉(zhuǎn)換:也稱強(qiáng)制類型轉(zhuǎn)換,簡稱強(qiáng)轉(zhuǎn).格式1:(類型名)變量或數(shù)值ーC語言中的格式2:類型名(變量或數(shù)值)-C++中的例:inta=5;Intb=2;floatf=(float)a/b說明:1).類型說明符和表達(dá)式都必須加括號(單個變量可以不加)2)?無論是強(qiáng)轉(zhuǎn)還是自轉(zhuǎn),都只是為了預(yù)算作的臨時性的轉(zhuǎn)換,不會改變數(shù)據(jù)說明時對該變量定義的類型.ハ.增量與減量運(yùn)算復(fù):.增量運(yùn)算符為“++”,功能是使變量+L減量運(yùn)算符為"--",功能是使變量減1..規(guī)則:++a:a加1后再參與其他運(yùn)算.a++:a參與運(yùn)算后其值再加1.a-一與一-a規(guī)則相同,例:inta=10;intb=++aI〃運(yùn)算完后b=11,a=11intb2=a++;〃運(yùn)算完后b2=11,a=12注:++a比a++效率高※面試題:以下哪個值是正確的?值為多少?a++=a+1;?a=a++;++a=a+1;@a=++a;9月23日關(guān)系和邏輯運(yùn)算符與分支語句--關(guān)系運(yùn)算符:就是用來比較大小的運(yùn)算符名稱>大于>=大于等于==等于<=小于等于<小于!=不等于.運(yùn)算符間不能有空格,而且JI質(zhì)序不能被顛倒.可以直接用于基本數(shù)據(jù)類型,但對于浮點(diǎn)數(shù)來說,只能比較大小,不能比較是否相等.※面試題:分別寫出BOOL,int,float.指針類型的變量a與“零”的比較bool:if(!a)if(a)int:if(O==a)float:constfloatEXP=0.000001if(a<EXP&&a>-EXP)//a在0.000001和一〇.000。指針:if(NULLi=a)orif(NULL==a)二.邏輯運(yùn)算符:.運(yùn)算符類型:a①&&與運(yùn)算②||或運(yùn)算③!非運(yùn)算2,優(yōu)先耐:.邏輯運(yùn)算符之間的按由高到低順序?yàn)?!(非)&&(與)||(或).讐運(yùn)飽辱他運(yùn)算符優(yōu)先級由高到低順序?yàn)椋簉!(非)算術(shù)運(yùn)算符關(guān)系運(yùn)算符&&和11I賦值運(yùn)算符3.運(yùn)算法則:&&:有〇則〇,全1為1II:有1為1,全〇為〇!:有1為〇,有〇為1(取反)101之間,無限接近于0..短路運(yùn)算:.在“與“運(yùn)算中,如果第一個運(yùn)算為0,后面的就不作運(yùn)算了..在“或“運(yùn)算中,如果第一個運(yùn)算為1,后面的就不作運(yùn)算了.注:只要運(yùn)算沒作完,就叫短路運(yùn)算,不管后面還剩幾個表達(dá)式或者前面作了多少個表達(dá)式的運(yùn)算..if語句:.語句格式:if(表達(dá)式1){語句塊1}elseif俵達(dá)式2)(語句塊2}elseif(表達(dá)式3){語句塊3}elseif(表達(dá)式n)(語句塊n}else(表達(dá)式m)語句塊m}五.switch:表達(dá)形式:switch(表達(dá)式)(case1:常量表達(dá)式1:語句組1case2:常量表達(dá)式2:語句組2casen:常量表達(dá)式n:語句組nbreak;default:語句組1}.switch后跟的表達(dá)式只能是int,char,枚舉的類型..case里如果要定義變量,要加大括號,例:switch(表達(dá)式)(case1:break;).多個case可以共用一組語句:case'A'case'B'case'C:print*".,);break;).使用技巧:為防止丟失break,先把結(jié)構(gòu)搭起來,再在結(jié)構(gòu)內(nèi)輸入內(nèi)容.9月24日循環(huán)語句的使用.while循環(huán):.反復(fù)執(zhí)行的程序E殳稱為循環(huán)體.循環(huán)變量:inti=0;i為循環(huán)變量.一般地,默認(rèn)一重循環(huán)寫為inti=0,二重循環(huán)寫為intj=0..一般格式:hile(一般是關(guān)系和邏輯表達(dá)式)(循環(huán)體后續(xù)語句;.while后不能加分號,加了就成死循環(huán).死循環(huán):循環(huán)體中無循環(huán)終止條件或循環(huán)條件永遠(yuǎn)為真.解決方法:通過break和return語句結(jié)束循環(huán)..死循環(huán)形式:while(1)).while循環(huán)執(zhí)行流程:首先判斷循環(huán)中的條件是否為真,如果為真,則執(zhí)行while循環(huán)體中的語句,執(zhí)行完畢后,再回到條件那重新判斷;如果為假,再跳過循環(huán)體,執(zhí)行后面的條件..do-while循環(huán):先執(zhí)行循環(huán)體中的語句,再判斷條件真假,如果為真則繼續(xù)循環(huán),為假則停止循環(huán).就是說它至少執(zhí)行一次循環(huán).一般格式為:do(循環(huán)體}while(表達(dá)式);后續(xù)語句;Xdo-while循環(huán)中whiIe(條件)后面的分號必須要加,否則編譯報(bào)錯..for循環(huán):格式:for(初始化;條件表達(dá)式;增量)(循環(huán)體;)for(inti=1;i<6;++i)在C語言中報(bào)錯,在C++中通過.死循環(huán):for(;1;)for循環(huán)不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,還可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況..其他:.題目:計(jì)算1+2+3+4+5.比較以下兩種寫法(結(jié)果ー樣):inti=1; inti=0;intSum=0; intSum=0;while(i<6) while(i<5){ {Sum=Sum+i; ++i;++i; Sum=Sum+i;})9月27日數(shù)蛆的應(yīng)用-.ー維數(shù)組的定義:數(shù)組是由一組同類型變量組成的集合,一般格式為:[存儲類型]數(shù)據(jù)類型符數(shù)組變量名[常數(shù)表達(dá)式];例如:intarraylnt[10]={0};longarrayLong[10]={0};;W:.數(shù)組成元素大小必須是整型常量表達(dá)式,不能是變量或變量表達(dá)式,因?yàn)閿?shù)組是靜態(tài)分配內(nèi)存的,在編譯時就確定了值..inta[4]={0};printf(B%d\n",sizeof(a)): 〃結(jié)果為16.Xsizeof的值取決徳纟睦個的長度..①#defineSIZE10;inta[SIZI]={0}; 〃編譯正確.②constintSIZE10;inta[SIZE]={0}; 〃編譯正確.③inta=10;constintSIZE=a;/Z到這ー步正確.intb=[SIZE]; 〃到這ー步錯誤!!原因:SIZE的值是由a來確定的,a是變量,如果中間有任何代碼改變a的值,SIZE就不變得不能確定了..下標(biāo):訪問數(shù)組中的特定元素是通過訪問下標(biāo)來實(shí)現(xiàn)的,如:inta[n]={0};下標(biāo)為。至(圖例:inta[3]={10,20,30}a[0]=10;b[1]=20;c[2]=30;下標(biāo)為:1020300 1 2.訪問越界:在訪問數(shù)組元素時,要保證下標(biāo)值在指訂的范圍內(nèi),如果超出范圍,編譯器不會報(bào)錯,但運(yùn)行的結(jié)果不可預(yù)知(特別要注意),例:intarray[3]={0};a[3]=10: 〃越界,下標(biāo)范圍為〇到2.※第一個數(shù)組元素的地址是數(shù)組所占內(nèi)存塊的首地址.二.數(shù)組的初始化:定義數(shù)組時,可以提供ー組用逗號隔開的初始值,用大括號括起來:intarray[3]={1,2,3};注意:.初始值的個數(shù)不能多于數(shù)組個數(shù).intarray[4]={1,2,3,4,5}/Z錯誤..中間的數(shù)組元素值不能被省略:intarray[4]={1,2,,4}; /Z錯誤.intarray[4]={1,2,0,4}; /Z正確..當(dāng)初始化數(shù)組個數(shù)少于數(shù)組元素個數(shù)時,剩余的元素自動為0intarray[4]={1};相當(dāng)于intarray[4]={1,0,0,0};.如果寫intarray[]={1,2,3},編譯時默認(rèn)數(shù)組a范圍為3Xinta口={〇}; /Z報(bào)錯.因?yàn)橹蟛荒苜x值a[1]=10;.比較inta[1]={0};和inta=0;.賦值:a[0]=10; a=10;.內(nèi)存都是4字節(jié).三.數(shù)組的賦值:數(shù)組間不能直接賦值,只能一個個賦值,如:inta[3]={1,2,3);intb[3]={0};b=a; /Z錯誤!!for(i=0;i<3;++i)(b[i]=a[i];} /Z正確!!※如果要對ー組長度較長的有規(guī)律的數(shù)組賦值,每ー個數(shù)組元素都列出來的話太麻煩,例如要對inta[10]賦值,賦成inta[10]={10,20,30,40,50,60,70,80,90,100);10個數(shù)都列出來賦值的話就太多了.可以用條件表達(dá)式:inta[10]={0};inti=0;for(i=0;i<10;++i)(a[i]=10*(i+1)}四.二維數(shù)組:.定義:有兩個下標(biāo)的數(shù)組稱為二維數(shù)組,第一個下標(biāo)表示該數(shù)據(jù)所在的行,第二個下標(biāo)表示所在列,一般形式為:inta[m][n];它表示定義一個有m行n歹!J,稱為m*n的數(shù)組,有數(shù)據(jù)m*n個..二維數(shù)組的初始化:有兩種方式:①.inta[3][2]={10,20,30,40,50,60};②.inta[3][2]={{10,20),(30,40),(50,60}};※無論用的是哪種初始化方式,訪問數(shù)組元素時的方式都通用.舉例:inta[3][2]={10,20,30,40,50,60};如果要訪問40:①的方式為:a[1][1].②的方式為:a[0][3].※在邏輯結(jié)構(gòu)中,某些越界的下標(biāo)方法也是正確可行的,例:如果要訪I可50:a[2][〇].(正常方式)a[〇][4].(越界方式:由于inta只有2列,從〇行開始算起的話,10就是列下標(biāo)就為0,20為1,這列結(jié)束后自動轉(zhuǎn)到下列,30為2,40為3,50為4)a[1][2].(同理從1行開始算起,30為0,40為1,轉(zhuǎn)到下一列,50為2)五.雜項(xiàng):.公式:從2開始依次往后排列{2,4,6..n}for(i=0;i<n-1;++i){array[i]=i*2+2;}.訪問下標(biāo)后可以直接參與數(shù)學(xué)運(yùn)算.9月28號字符串?dāng)?shù)蛆字符數(shù)組的定義及初始化:.定義:字符串是存儲在內(nèi)存中的一系列連續(xù)的字符,可以是以在char數(shù)組中的形式中出現(xiàn),每個字符就是ー個字符數(shù)組的元素,例:charszName[10]=n";或charszName[10]={0};這個字符數(shù)組占據(jù)了10個字節(jié),但只能存儲(n-1)個字符,因?yàn)閿?shù)組的最后ー個要存儲‘、〇’,用以結(jié)束ー個字符數(shù)組..初始化:字符數(shù)組的初始化方式和一維數(shù)組的ー樣,但每個字符要加單引號或整體加雙引號,例:charszName[4]={,A','B','C',};或charszName[4]="ABC"; 〃這種常用.※注意以下幾種方式:①.charszName[]="ABC": 〃正確!!?.charszName[]=""; 〃錯誤!!.charszName[5]="ABCDE";/Z錯誤!!(特別注意‘、。')--字符串的輸出:printf:和一維數(shù)組ー樣.puts:puts(szName);※比較puts和printf:puts(szName);==printf(u%s\n",szName);總結(jié):puts會自動加回車,而且puts不限制輸出的類型.putchar:只接收單個字符,如果想接收字符串的話,就用循環(huán)做,例:charszName[10O]=for(i=0;i<6;++i)(szName[i]=getchar();)puts(szName);三.字符串的輸入:scant:一般格式:scanf("%s",szName);?.scant輸入字符串的時候不要加'&'號.②.scanf("%ns",szName);其中的n表示規(guī)定接收字符的數(shù)量,如:scant("%4s”,szName);/Z只接收輸入的前4個字符,后面再輸入其他的也無效.gets:一般格式為:gets(szName);它能接收任何字符或字符串.getchar:只能輸入單個字符,用法類似putchar.getch:只能輸入單個字符,限制輸入個數(shù).一般用于用戶名和密碼的輸入.用法:for(i=0;i<6;++i)(nlnput[i]=getch();/Z回顯的結(jié)果為?號,密碼只能輸入6位.printf("*H);}對比scanf,gets,getchar和getch:格式scantgetsgetchargetch回顯回顯輸入回顯輸入回顯輸入不回顯輸入限制可不限制也可根據(jù)要求限制個數(shù)不限制輸入個數(shù)不限制輸入個數(shù),只顯示規(guī)定長度的元素限制輸入的個數(shù)ESC不能接收ESC能接收ESC不能接收ESC能接收ESC回車能接收回車能接收回車能接收回車能接收回車空格不能接收空格能接收空格能接收空格能接收回車四.字符串處理函數(shù):字符串標(biāo)準(zhǔn)函數(shù)的頭文件為:#include<string.h>.內(nèi)存賦值函數(shù):memset可以用于數(shù)組的初試化和清理內(nèi)存,例:.memset(szName,‘、〇’,10〇); //表示把數(shù)組szName前100位的元素清〇,.memset(szName,'A',5); //表示把前數(shù)組前5位的元素都替換成A..memset(szName+5,A,5) 〃表示從數(shù)組下標(biāo)為5的元素開始往后5個元素都替換成A..inta[10]={1,2,3);memset(a,0,sizeof(a));memset(str,'\0\sizeof(str));//表示把str全部元素清〇..字符串拷貝:srtcpy格式為:strcpy(字符數(shù)組1,字符數(shù)組2);strcpy(字符數(shù)組名,字符常量);※只有上面這兩種格式,整型數(shù)組等不可用.strncpy(szTemp+x,“ABC”,n); //表示把數(shù)組下標(biāo)為x的元素開始往后按順序替換成A,B,C的前n位.注:(1).被copy者的長度一定要夠長,不然崩潰..對于這樣的情況: ABcD\0\0\0\0strcpy(szBuffer,“12”);替換后打印為12,因?yàn)槟J(rèn)”12”后會跟“'0”(字符串以、〇”結(jié)尾),strcpy遇到后打印就會結(jié)束,D不會打印出來,如果用printf(u%c\n",szBuffer[3]);就可以把D打印出來..strncpy(str,,,12345",2);〃意義:只復(fù)制”12345”的前兩個字符給str字符串..strncpy(szA+x,szB+y,z);/Z意義:把szB的下標(biāo)為y之后的z個字符,復(fù)制給szA以下標(biāo)為x的字符后面去.(包括x.y的元素).統(tǒng)計(jì)字符串長度:strlen格式:strlen(字符串常量);strlen(字符數(shù)組名);返回值為無符號整型.工作方式:檢查‘、〇’,沒遇到就+1,遇到就結(jié)束(返回值不含''0').Xstrlen(szA+x);/Z意義統(tǒng)計(jì)szA下標(biāo)為x開始之后的長度..字符串比較:strcmp格式:盤ゆ(1^(字符串1,字符串2);本質(zhì):ヒ匕較相同位置上的ASCII碼值的大?。ǔS糜诒容^字符串是否相等).注:(1).strncmp(“12345”,“123”,3);/Z意義只比較前3個字符是否相等.(干萬別漏n)想要輸出ヒ匕較結(jié)果的話,要先建一個int然后把stremp賦值給它,如:inta=0;a=strnemp(字符串1,字符串2);printf("%d\n",a);(2).strncmp(szA+x,szB+y,z);/Z意義從數(shù)組szA下標(biāo)為x的元素開始,和數(shù)組szB下標(biāo)為y的元素開始往后比較只比較z個數(shù).(比較的元素包括x,y)5.字符串拼接:strcat描述:將字符串2拷貝到字符串1的尾部.格式:strcat(數(shù)組,常量);strcat(數(shù)組1,數(shù)組2);strcat(字符串1,字符串2);Xstrncat(szA,szB+y,z);/Z意義把數(shù)組szB下標(biāo)為y的元素開始往后的前z個元素與數(shù)組szA拼接(不包括y元素)(szA+x無效).五.雜項(xiàng):.gets和puts的s都是指的字符串,和%s意義ー樣..輸入規(guī)定長度的密碼且以“*”號顯示:for(i=0;i<6;++i)szPass[i]=getch();printf("*");.倒序輸出的代碼格式:charszlnput[10]="";inti=0;for(i<9;i>=0;--i)(if(,\O,==szlnput[i])(continue; /Z紅字部分意義為:如果輸出的是結(jié)果為、〇,則跳過,不輸出.)putchar(szlnput[i]);}printf("\n");.if(0==i%5)(printf(u\n");//表示每行排5個元素.)10月9日函數(shù)的應(yīng)用函數(shù)的概念:.將一些大的或者是功能相同的程序分割成一個個程序塊,在使用的時候可以直接調(diào)用,這種程序塊就稱為函數(shù)..函數(shù)的作用:.函書是構(gòu)成程序的基本單元..函數(shù)的使用可以省去重復(fù)代碼的編寫..函數(shù)使得程序更加模塊化,從而有利于程序的閱讀.修改和完善..函數(shù)的分類:.按函數(shù)定義的角度分為:.庫函數(shù):由C++系統(tǒng)提供,用戶無須定義,只需在程序前包含有該函數(shù)原形的頭文件即可在程序中調(diào)用..用戶自定義函數(shù):由用戶按需要寫的函數(shù).(2),按函數(shù)的返回結(jié)果角度分:.有返回值函數(shù)..無返回值函數(shù)..按函數(shù)間數(shù)據(jù)通信方式分:.無參函數(shù):函數(shù)定義.函數(shù)說明及函數(shù)調(diào)用中均不帶參數(shù)..有參函數(shù):在函數(shù)定義及函數(shù)說明時都有參數(shù)(形參),在函數(shù)調(diào)用時也給出參數(shù)(實(shí)參).派main。函數(shù)是主函數(shù),它可以調(diào)用其他函數(shù),而不允許被其他函數(shù)調(diào)用..函數(shù)的ー些約定:.函數(shù)不能嵌套定義,要另外寫..允許嵌套調(diào)用(在ー個函數(shù)中調(diào)用另一個函數(shù))..允許遞歸調(diào)用(在函數(shù)中調(diào)用它自己本身)..C++源程序必須有,也只能有一個主函數(shù)main().4.函數(shù)的幾種形式:.voidf():〃函數(shù)聲明(原形).voidf()(..-; //函數(shù)定義(實(shí)現(xiàn))).f(); 〃函數(shù)調(diào)用二.函數(shù)的定義:※說明:返回值類型:函數(shù)返回給調(diào)用者的數(shù)據(jù)的類型.函數(shù)名:是由用戶定義的標(biāo)識符,它的命名規(guī)范為:.首字母必須大寫..要求用大/」與字母組合規(guī)范函數(shù)命名,即每個單詞的首字母也大寫..最好用下劃線進(jìn)行間隔,例:intSum(int_nNum1,int_nNum2)(return(_nNum1+_nNum2): 〃int后有空格.}.無參函數(shù)的定義:格式:返回值類型函數(shù)名(void) //void可不填.{語句塊;〃函數(shù)體.).有參函數(shù)的定義:格式:返回值類型函數(shù)名(形式參數(shù)列表)(語句塊;〃最后一定要有return(..)作為結(jié)尾.}三.函數(shù)的參數(shù):函數(shù)的參數(shù)分為形參(形式參數(shù))和實(shí)參(實(shí)際參數(shù))兩種..形參出現(xiàn)在函數(shù)定義中,并在整個函數(shù)體內(nèi)都有效,當(dāng)該函數(shù)結(jié)束后不能使用..實(shí)參出現(xiàn)在主調(diào)函數(shù)中,逬入被調(diào)函數(shù)后,實(shí)參變量不能使用..形參和實(shí)參具有以下特點(diǎn):.實(shí)參和形參在數(shù)量上.類型上.順序上應(yīng)嚴(yán)格一致,否則會發(fā)生”類型不匹配”的錯誤..形參變量只有在被調(diào)用時才分配內(nèi)存單元,只有在函數(shù)內(nèi)部有效,函數(shù)結(jié)束后不能再使用..實(shí)參和形參占據(jù)不同的存儲單元..函數(shù)默認(rèn)采用值傳遞,即實(shí)參的值單向傳遞給形參,實(shí)參的值并不改變(無論形參怎么改)..實(shí)參可以是常量.變量.表達(dá)式甚至是函數(shù),但是在傳遞給函數(shù)前,必須有確定的值.※理解形參只在函數(shù)內(nèi)部有效:voidSwap(int_a,int_b)(inttemp=_a;_a=_b;_b=temp;)intmain(argc,char*argv)/Z此運(yùn)算得出來的結(jié)果為“x:10y:20"/Z因?yàn)樾螀⒅辉诤瘮?shù)內(nèi)部有效,所以無論形參怎么互相賦值,都不會改變實(shí)參的值.intx=10;inty=20;Swap(x,y);printf("x=%d,y=%d\n",x,y);)四.函數(shù)的返回值:定義:是指函數(shù)被調(diào)用之后,被調(diào)用的函數(shù)返回給主調(diào)函數(shù)的值.在使用函數(shù)返回值的時候應(yīng)注意以下幾點(diǎn):.它是通過return語句返回主調(diào)函數(shù)的,以下是幾種方式:return:在無返回值函數(shù)中使用.return(常量);例如:return100;或return"OK.";return(變量);例如:returna;return(表達(dá)式);例如:returna*b;return(計(jì)算語句);例如:return(a>b?a:b);.在函數(shù)中允許有多個return語句,但每次調(diào)用只能有一個return語句被執(zhí)行,只能有一個返回值.例:intmax(int_a,int_b)(if(_a>_b)(return_a;} //如果沒有下面的else,就會報(bào)警告,因?yàn)楹瘮?shù)沒有return作為結(jié)束.elsereturn_b;)}語句塊可以優(yōu)化成:if(_a>_b)(return_a;)return_b;最簡單的方法是用三目運(yùn)算的條件表達(dá)式:(a>b?a:b).函數(shù)返回值類型和函數(shù)定義時的返回值類型應(yīng)保持一致,如果不一致,則以函數(shù)定義時為準(zhǔn),自動進(jìn)行類型轉(zhuǎn)換,例:intSum(int_value)(return_value*10.5; //返回結(jié)果為10;丟失精度.}.無返回值的函數(shù),返回值可以明確定義為“空類型”,但是不能不寫返回值類型,類型為“void”.返回值可以不寫,也可以寫“return;".當(dāng)在函數(shù)中使用return語句返回后,其后面的語句將不會被執(zhí)行.五.函數(shù)的聲明及調(diào)用..聲明格式:返回值類型函數(shù)名(形式參數(shù)列表)或者是返回值類型函數(shù)名(形參類型,形參類型,...)例如:voidf();.函數(shù)可以被多次聲明,但只能定義一次.注:函數(shù)聲明里有這種情況:intMax(int_a,int_b);可以寫成intMax(int,int);注:定義的時候一定不能省..函數(shù)的聲明就是函數(shù)的原形.※要學(xué)會看函數(shù)的原形,從原形里知道函數(shù)的用法.(3),當(dāng)函數(shù)寫在main下面的時候,就要在main函數(shù)前面進(jìn)行聲明,如果寫在前面,就不需要聲明(也可以寫)..函數(shù)的調(diào)用格式:函數(shù)名(實(shí)際列表參數(shù));例如:f();.函數(shù)的嵌套調(diào)用:C語言和C++中不允許嵌套的函數(shù)定義,但允許在一個函數(shù)中調(diào)用另ー個函數(shù),叫嵌套調(diào)用.10月10日函數(shù)與變量--程序的內(nèi)存區(qū)域:.代碼區(qū):存放程序的代碼和和各個函數(shù)的代碼塊..數(shù)據(jù)區(qū):存放程序的全局變量和靜態(tài)變量及常量.(由系統(tǒng)自動管理).棧區(qū):存放程序的局部變量.用于存放非常小的數(shù)據(jù),PC上1M左右,手機(jī)上1K左右.它存放的數(shù)據(jù)為:.臨時變量..函數(shù)的形參..8字節(jié)長度左右的數(shù)據(jù)..堆區(qū):存放動態(tài)數(shù)據(jù),需要用指針訪問.最大支持2G(PC),手機(jī)上為2M.※棧區(qū)和堆區(qū)的區(qū)別:.堆區(qū)的內(nèi)存由自己申請自己釋放,如果申請了不釋放,就叫內(nèi)存泄漏;棧區(qū)的內(nèi)存是由系統(tǒng)自動分配的,沒有內(nèi)存泄漏問題..棧區(qū)放非常小的數(shù)據(jù),堆區(qū)放比較大的數(shù)據(jù)..堆區(qū)相比靈活性更高,而棧區(qū)則效率更高..棧區(qū)不會出現(xiàn)碎片,堆區(qū)會出現(xiàn)..就內(nèi)存位置來說,棧區(qū)是順序分配的,堆區(qū)是隨機(jī)分配的.二.全局與局部變量:.全局變量:在函數(shù)外部定義的變量,不屬于哪ー個函數(shù),而是屬于ー個源程序文件..局部變量:也稱為內(nèi)部變量,現(xiàn)默認(rèn)所有非全局變量都為局部變量..靜態(tài)全局變量:格式:staticinta=0;.靜態(tài)局部變量:如果希望在ー個函數(shù)結(jié)束后保留在其內(nèi)部的局部變量的值,就用"static”進(jìn)行聲明,稱為靜態(tài)局部變量.格式:staticintb=10;※比較幾種變量的區(qū)間.生命周期.作用域及初始值:類型區(qū)間生命周期作用域初始值全局變量數(shù)據(jù)區(qū)main函數(shù)執(zhí)行之前被創(chuàng)建,在整個程序結(jié)束之前被回收.從定義開始到文件結(jié)束的所有函數(shù);在同一個項(xiàng)目中其他文件都可以使用.0靜態(tài)全局變量(static全局變量)數(shù)據(jù)區(qū)同上從定義開始到文件結(jié)束的所有函數(shù);其他項(xiàng)目中的文件不可以使用.0局部變量棧區(qū)從程序被調(diào)用時被創(chuàng)建,在該程序塊結(jié)束前被回收.從定義開始到大括號結(jié)束.即只能在代碼塊中的語句使用.隨機(jī)值靜態(tài)局部變量(static局部變量)數(shù)據(jù)區(qū)函數(shù)不被調(diào)用時不創(chuàng)建,第一次調(diào)用的時候被創(chuàng)建,之后再用就不會被創(chuàng)建了(可以忽略不看了,只被初始化一次).在整個程序結(jié)束前被回收.同上0以上表理解全局函數(shù),靜態(tài)全局函數(shù)(規(guī)則ー樣).注:沒有局部函數(shù)的概念,因?yàn)楹瘮?shù)不能嵌套.三.雜項(xiàng):.ネ呈序在執(zhí)行的時候,先從當(dāng)前的代碼塊中尋找,找不到再到外面找,找不到再到全局變量去找,再到別的文件去找,還是找不到就報(bào)錯..如果在ー個程序塊里要訪問ー個全局變量,就在變量前面加雙冒號”::”(局部變量重名時使用)例:staticina=0;printf("%d\n",::a);.constintSIZE=100;寫在函數(shù)里就占用棧區(qū),寫在函數(shù)外就占數(shù)據(jù)區(qū)(相當(dāng)于全局變量).以下例子為說明局部變量的作用域的,輸出結(jié)果為“10,0".intmain()(inta=0;charch[100]="";while(1)inta=10;printf("%d\nM,a);if(10=—a)break;))printf(M%d\n",a);return0;)10月12日指針的使用指針:.概念:指針就是地址..指針占4個字節(jié)(因?yàn)槿魏蔚刂范际鞘J制的,類似0012FF5C,每個字符占4個位,ー共8個字符=4個字節(jié))..在書中或程序中的指針一般指的都是指針變量(簡稱).二.指針變量:.概念:指針變量是用來存放另ー個變量的內(nèi)存地址的變量.如果變量A存放著變量B的地址,我們可以說變量A指向變量B..定義:定義指針的目的是為了要通過指針間接地去訪問變量的值.格式:數(shù)據(jù)類型?指針變量名;數(shù)據(jù)類型?指針變量名;例:int*p;int*p;.ー個類型的指針變量只能指向同類型的變量,不能指向其他類型的變量..在定義指針時,“*”號只能代表一個指針.X(1).int*a,b; //會有歧義.不能這么寫.int*a,*b; 〃正確,但不建議.int*a;int*b;/Z建議寫法..int*p;-p是指針,指向ー個整型.int*p;—p是變量,存的是int*.int(*p)[10];-*p萌針,存的是10個元素的數(shù)組,元素類型為int.類推:void(*p)(int);1p是無返回值的類型為int的函數(shù).int*p[10];—p是存了10個元素的數(shù)組,元素類型為int*..定義完后(int*p=&a;),如果看到下面的代碼中有“*”號的如“*p”的就表示訪問(*p=100;),意思是把P指向的變量a的值替換成100,等價于(a=100;).例:inta=10;int*p=&a;intb=*p+3等同于intb=a+3;*p+=6 等同于a+=6;.指針變量的初始化:格式:數(shù)據(jù)類型?指針變量名=&變量名;規(guī)范的命名格式為:intnLength=0;int*pnLength=&nLength;.未初始化前的值不確定,不能使用,否則造成崩潰..指針變量的值可以改變,即指向可以改變..指針不能亂指向,會造成訪問出錯,一般都指向首地址..如果ー個指針在定義后沒有初始化,可以給它賦一個空值:int*p=NL)LI_;.如果清楚變量的地址,可以直接定義地址,例:inta=10;int*p=&a;/Z輸出結(jié)果為a的地址:0012FF5C可以寫成int*p=((int*)0x0012FF5C);.賦值:可以直接把ー個變量的地址賦值給一個指針變量,如:inta=10;intb=20;int*p=&a;p=&b;(1),指針賦值時,不能在指針變量前面加“*”..不允許把ー個整型數(shù)賦值給指針變量,因?yàn)橹羔樧兞康闹挡皇且粋€整型數(shù),而是地址.p=1000;/Z錯誤!p=0x0012FF5C;/Z錯誤!p=&1000;/Z錯誤!p=(int*)0x0012FF5C;/Z編譯不會報(bào)錯,廳行結(jié)果未明,除非自己很清楚指向的對象,オ不會崩潰(不建議使用)..類型匹配:如果賦值或初始化時被賦值的類型與指針變量的類型不匹配,編譯會報(bào)錯.(void指針除外)三.間接引用指針:.當(dāng)指針被賦值后,可以通過指針來間接訪問被指向的變量.如:inta=10;int*p=&a;printf("&a=%p\n",&a);/Z結(jié)果和printf("p=%p\n",p);是一樣的..void的指針可以指向任何的變量(const對象除外),需要進(jìn)行強(qiáng)轉(zhuǎn)后才能使用,如:inta=10;void*p=&a;/Z定義.*p=100;/Z錯誤!*((int*)p)=100; //正確,強(qiáng)轉(zhuǎn).printf(u%d\n",*((int*)p));〃相當(dāng)于printf("%d\n",a);以上的代碼等同于int*b=(int*)p;*b=100;10月14日指針的運(yùn)算指針的加減法:.指針與整數(shù)的加減法:法則如下:pnlD±n<==>pnlD±n*sizeof(指針類型);例:inta[3]={10,20,30);int*p=&a[0];p=p+1; ==>p=p+1*sizeof(int);〃sizeof()括號內(nèi)的類型和數(shù)組類型一致.printf(u%d\n",*p);/Z結(jié)果為20,p指向了2〇.如果沒有p=p+1;printf("%d\n",*(p+1));〃結(jié)果也為20,但p還是指向10.派?p是一個整型的指針,加1后會使指針指向第2個元素,因此?p的地址實(shí)際上增加了4.理解:p=p+1*sizeof(long);p=p+1*sizeof(char);.指針之間的運(yùn)算:法則如下:pnlD-pnlD1<==>(pnlD-pnlD1)/sizeof(指針類型);例:inta[3]={10,20,30);int*p=&a[0];int*q=&a[2];q-p;〃printf結(jié)果為2.p-q!〃printf結(jié)果為ー2.意義:看q跟p之間有多少個元素,一般為大的減小的.正負(fù)無意義..指針之間的比較運(yùn)算(地址值的比較):p=&a[0]:〃設(shè)a⑼的地址為1000.q=&a[2];〃則a[2]的地址為1012.(q>p)表達(dá)式為真.二.指針與一維數(shù)組:.用數(shù)組名訪問數(shù)組元素:數(shù)組名保存的就是數(shù)組的首地址,例:inta[3]={10,20,30);int*p=&a[0];<==>int*p=a;Xa是數(shù)組,a的值為數(shù)組a的第一個元素.*p是指向變量的指針.如何理解:如果a是一個數(shù)組,第一個元素的地址可以表示為&a[〇]或簡單表示為a.相應(yīng)地,第二個元素的地址可以寫成&a[1]或者(a+1),第(i+1)個元素地址可以表示為&a[i]或(a+i).因此,一個數(shù)組元素的地址可以使用兩種方式表示..用指向數(shù)組的指針訪問數(shù)組元素:將一個數(shù)組的地址賦值給ー個指針,疇針指向這個數(shù)組,其實(shí)就是將這個數(shù)組的首地址賦值給指針.如:inta[3]={10,20,30);int*p=NULL;p=&a[0];<==>p=a;三.通過指針引用數(shù)組元素:.如果p的初始值為&a[〇],則:.a[i]<==>p[i]<==>.&a[i]<==>&p[i]//.(a+i)<==>(p+i)//*(a+i)<==>*(p+i) //取a[i]的內(nèi)容,和數(shù)組的運(yùn)用一樣.訪問第i個元素.取a[i]的地址.(4).++p;<==>(p+1)〃p可以做增量. -1++a;/Z錯誤,不能對數(shù)組名做可以改變其值的運(yùn)算.J所以,引用ー個數(shù)組元素可以用:數(shù)組與指針的區(qū)別.下標(biāo)法:a[i].指針法:*(a+i)<==>*(p+i)〃a是數(shù)組名,p是指向數(shù)組的變量,p=a.派①.@.不能用指針來求數(shù)組的元素個數(shù)(未知數(shù)組長度的情況下),sizeof行不通,因?yàn)榻Y(jié)果永遠(yuǎn)為4.指針永遠(yuǎn)認(rèn)為它指向的當(dāng)前元素為第一個元素:inta[3]={10,20,30};int*p=a;printf("%d\n",p[1]);++P;printf("%d\n",p[1]);訪問方式:printf("%d\n",*p);&*a<==>a<==>*
/Z輸出結(jié)果為2〇./Z輸出結(jié)果為3〇.<=>printf("%d\n",*a);&a理解:&*a==>&x==>3&*a==>*temp==>a見右圖.(5).int*a=10;int*b=20;voidSw叩(int*a,int*b)四.指針與函數(shù):.指針變量作為函數(shù)參數(shù):通過指針變量以實(shí)參的形式傳遞給函數(shù),可以在函數(shù)中改變實(shí)參的值,例:(參考下圖理解)inta=10;intb=20;voidSwap(int*_a,int*_b)inttemp=*a;〃①*a=*b; 〃②*b=temp; //③)intmain(intargc,char*argv[])intx=10;inty=20;Swap(&x,&y);printf("%d,%d",x,y);/Z結(jié)果為(20,10).return0;)如果把void函數(shù)內(nèi)條件換成以下條件是什么結(jié)果(畫圖畫出來):.int*temp=a;*a=*b;*b=**temp=NULL;temp=*a;a=*b;b=*temp;/Z結(jié)果崩潰..數(shù)組名作函數(shù)參數(shù):格式:voidf(inta[],int_Length)//此條件等同于:voidf(int*a,int_Length)(intb[100]={ };f(b,100);)X(1).inta[]針<==>int*a[1000]和intaロー樣,U里寫多少都沒影響,sizeof的結(jié)果都為4,所以一般不填..指針型函數(shù):返回值為指針類型的函數(shù)叫指針型函數(shù).格式:返回值類型?函數(shù)名(形參表)(.?…/Z函數(shù)體.10月15日字符指針和字符串指針字符串的表示形式:.字符數(shù)組表示字符串:.用字符串指針表示字符串:※對比以下兩種情況:.注意指針與數(shù)組的區(qū)別:char*p="ABCD”;p="ABCD";chara[100]="ABCD'';a="ABCD";/Z報(bào)錯!strcpy(a,11ABODE");/Z正確!printf("%p\n",p);<==>printf(u%P\n","ABODE");/Z輸出結(jié)果都為"ABODE".strcpy(a,"ABODE"); /Z正確.strcpy(p,"ABODE"); /Z崩潰..chara[100]="";char*p=szBuffer;strcpy(p,"12345");/Z正確!!Puts(p);總結(jié):數(shù)組a數(shù)據(jù)存在棧區(qū),可以被修改,但p指向的字符串是存在數(shù)據(jù)區(qū),為常量,不可被修改,指針只要涉及到修改常量的內(nèi)容的代碼,運(yùn)行結(jié)果一定崩潰.如何判斷:要看指針指向的是什么,第一種情況指向的是常量,所以不能改;第二種情況指向的是數(shù)組,數(shù)組的值可以更改,所以正確.注意使用數(shù)組名的時候,printf(u%s\n",a)的意義就是打印以a的首地址為開頭往后的字符,至い?!Y(jié)束,所以當(dāng)char*p=&a或“ABC”的時候,p保存的是a的首地址,printf(H%\n*二.二重指針:指向指針的指針,就叫二重指針.格式為int*inta=inta=10;0x1234int*p=&a;0x6666a100x1234Pz0x66660x9999qint*q=&P;a=10*p=ap=0x1234*q=p.&qq=0x6666**q=a&a=0x1234&p=0x6666&q=0x9999三.雜項(xiàng):.保存數(shù)組有三種方式:.char[] //C語言.char* //C語言p)就是打印以p指向的首地址開頭往后的字符,至(l'\0’結(jié)束..string //C++.Cstring //MFC.char*str="ン存的是‘、。’的首地址..參考右圖理解以下代碼:voidTest(char*p)p="hello"; //③)//④intmain()(char*str="ABCD";〃①Test(str); //②puts(str);//答案為“ABCD”return0;)XTest。括號內(nèi)傳進(jìn)去的參數(shù)要和voidTest。內(nèi)的類型一致..數(shù)組要賦值只能用strcpy寫,不能直接用等號.10月16日指向函數(shù)的指針和指向數(shù)組的指針指向函數(shù)的指針:1.格式:
⑴:voidf())void(*p)()=&f;/Z回調(diào)函數(shù):由自己實(shí)現(xiàn),由系統(tǒng)調(diào)用,如鼠標(biāo)點(diǎn)擊右鍵.(2):inth(int_a,int_b))int(*p)(int,int)=&h//括號里的是(int),不能寫(int_a,int_b).<==>int(*p)(int,int)=h;/Z也對,沒那么標(biāo)準(zhǔn).(3).void(*p[5])()={f,f2};意義:p是個數(shù)組,*P是指針數(shù)組,指向的是void函數(shù).定義的方法:和數(shù)組ー樣.void*p=&f;((void(*)())p)();//使用方式:強(qiáng)轉(zhuǎn)二.指向數(shù)組的指針:.格式:inta[10]={...};int(*p)[10]=&a;/Z寫a會報(bào)錯(如果編譯可以過的話,就理解為等號兩邊是同類型的).p[0]=10; H報(bào)錯.※和int*p=a;對比理解..調(diào)用:p[0][1]=20;<==>(*p)[1]=20;
特別注意P不是二重?cái)?shù)組.對比:inta1[10]={...};int*b=a1;b[0]=100;注意:p[〇]和b[〇]訪問的都是當(dāng)前元素的第一個元素,因?yàn)閎[0]指向的是變量a1的首地址即a1[0],而p[0]指向的是整個數(shù)組a,當(dāng)出現(xiàn)p+1和b+1的時候,再次使用p[〇]和b[〇]的時候,b[0]為a1的第二元素a1[1],而p[〇]則為垃圾值.因?yàn)閜+1跳過的不是ー個元素,而是整個數(shù)組..指向二維數(shù)組的指針:.格式:int(*p)[5][3]=&a;.對比以下代碼:inta[10]={...};intinta[10]={...};int*p=a;<==>a[0]int(*)[10]=&a;int[10]<==>aint(*p)[5][3]=&a;p[O]=a;//int(*)[3]<==>&a[O]int[3]<==>a[0]p[0][2][1]=100;//不是三維數(shù)組,只是訪問方式..sizeof(int*(*a[3])[4]);/Z結(jié)果為12,因?yàn)閍是個數(shù)組,存的是指針(指向數(shù)組的指針).三.const指針:總綱:①.const對象的地址只能賦值給const對象的指針.②.指向const的指針常被用作函數(shù)的形參(不能通過修改形參去改變實(shí)參的值).③.任何非const數(shù)據(jù)類型的指針都可以被賦值給void?類型的指針.const數(shù)據(jù)類型的指針只能賦值給constvoid?型的指針.constinta=10;constvoid*p=&a;⑤.void?型的指針被稱為泛型generic指針,它可以指向任意數(shù)據(jù)類型的指針(constヌ惓除外).constchar*p<==>charconst*p定義:pisapointertoconstchar..p是指針(變量),值可以改變..p可以指向的數(shù)據(jù):.P可以指向const對象:constintSIZE=100;constint*p=&SIZE;&p=200;/Z錯誤!.p可以指向非const對象:intnLength=100; 、,?constint*p=&nLength; a**p(3),無論constヌ摻是什么類型,它本身是否可以更改,從p角度都不能改constヌ摻的值(編譯報(bào)錯).char*constp:定義:pisaconstpointertochar..p必須初始化;p不能改變它的值(不能改變p的指向);p是const指針..p可以指向的數(shù)據(jù):.P可指向非const對象:inta=0;*p=100;//正確.int*constp=&b=20;p=&b;/Z錯誤!.p不能指向const對象:constintSIZE=100;int*constp=&SIZE; 〃豊吳!!10<—.從p角度可以修改const對象的值. a pconstchar*constp(前兩種情況的合成)定義:pisaconstpointertoconstchar..p是const值,不可改變必須初始化..p可岫向的數(shù)據(jù):.p可指向非const對象..P也可指向const對象..從p角度不能改變const對象的值.a「~p0月17日動態(tài)和靜態(tài)內(nèi)存分配一.M^:.靜態(tài)分配:編譯器在處理程序源代碼時分配..動態(tài)分配:程序執(zhí)行時按動態(tài)要求分配.※(り.靜態(tài)分配效率高,動態(tài)分配靈活性高..靜態(tài)對象都是有名字的變量,我們直接對其操作,而動態(tài)對象是沒有名字的變量,我們是用指針間接地對它逬行操作..靜態(tài)對象的分配與釋放由編譯器逬行處理,動態(tài)對象必須由程序員顯式的管理,相對來說較易出錯.二.分配動態(tài)內(nèi)存函數(shù):1.C:頭文件:<stdlib.h>分配:malloc()n釋放:free() 一ー庫函數(shù)」能直接釋放,如:free(p);(口內(nèi)不用填)定義:int*p=(int*)malloc(sizeof(int);int*p=(int*)malloc(sizeof(int)*100);初始化:無法初始化.使用:不需調(diào)件可函數(shù).C++:無須頭文件分配:new '釋放:deleteゴニ三種用法對應(yīng)的釋放方式:(1).int*p=newint;對應(yīng)=>deletep;(2).int*p=newint[5];對應(yīng)=>delete[]p;//(3).int*p=newint(5);對應(yīng)=>delterp;定義:int*p=newint;int*p=newint[100];初始化:int*p=newint(100);==>兩串:int*p=new;p=100;使用:new需要調(diào)用構(gòu)造函數(shù),delete需調(diào)用析構(gòu)..malloc():?函數(shù)原形:void*malloc(unsignedintsize);?說明:①.size這個參數(shù)的含義是分配的內(nèi)存的大小(以字節(jié)為單位)..返回值:失敗,貝リ返回值是NULL(空指針).成功,則返回值是ー個指向空類型(void)的指針,即所分配內(nèi)存塊的首地址.?初始化:見下面例子.?舉例:①:*ハ“ハ 可以寫成4,但不建議(因?yàn)榘姹镜膯栴},比如老版本sezeof(int)為2,寫成4就不能用了,要改源代碼)mtp=(mt)malloc(sizeof(int)); j看等號前面是什么類型的就強(qiáng)轉(zhuǎn)成什么類型的(照寫)p=100;//相當(dāng)于初始化(用賦值的方式).!!必須有這ー步.
②:int*p=(int*)malloc(sizeof(int)*5);棧區(qū)|_nP后面的5意義為申請了5個字節(jié)- 冃F—堆區(qū)r-※動態(tài)內(nèi)存都在堆區(qū).(2).free():在分配了動態(tài)內(nèi)存以后,如果不釋放(free),就會引起內(nèi)存泄露.三.野指針:.定義:不是“NULL”指針,是指向“垃圾”或不確定位置的內(nèi)存的指針..有三種情況會出現(xiàn)野指針:.指針變量沒有被初始化..指針p被free或delete之后,沒有置為NULL,讓人誤以為p是個合法的指針.看以下例子:intmain(intargc,char*argv[])(int*p=(int*)malloc(sizeof(int));print耳“%d\n",*p); /Z打印結(jié)果為隨機(jī)值.printf(K%p\nM,p);ヽ*p=100;free(p);printf(M%d\nM,*p);free(p);〉如果沒有p=NULL的話,打印結(jié)果為同一個地址值,因?yàn)槭褂猛旰筢尫帕藘?nèi)存里的東西,但p的指向并沒有改變
p=NULL;*p=1000;printf("%p\n",p=NULL;*p=1000;printf("%p\n",p);printf("%p\n",*p);/Z錯誤!想要再使用指針P,就要先重新賦值:p=(int*)malloc(sizeof(int));然后使用就沒問題了./Z打印結(jié)果全為0.(沒有p=NULL就為野指針)/Z崩潰!!return0;)※為避免出現(xiàn)這種情況,通常這樣用:int*p=NULL;if(p!=NULL)}.指針操作超越了變量的作用范圍(不易發(fā)現(xiàn)).voidTest(void)(int*p=NULL;{inta=100; //a是局部變量,括號結(jié)束后被收回.p=&a; //p指向a.)&p=200;/Z錯誤!a已被收回,p還指向a.這時修改&p就等于修改100的值.〃????
四內(nèi)存泄露(memoryleak):指ー塊動態(tài)分配的內(nèi)存,我們不再擁有指向這塊內(nèi)存的指針,因此我們沒有辦法將它返回給程序供以后重新使用.數(shù)據(jù)區(qū)棧區(qū)堆區(qū)100個內(nèi)存塊char*p=(char*)malloc(sizeof(char)*100);//①數(shù)據(jù)區(qū)棧區(qū)堆區(qū)100個內(nèi)存塊/Z還未釋放.p="123";〃②報(bào)錯.????puts(p);free(p);/Z崩潰(free只能釋放堆區(qū)的數(shù)據(jù),不能釋放數(shù)據(jù)區(qū)的數(shù)據(jù)).如右圖所式.注意:1.如果函數(shù)行參是ー個指針,不要指望用該指針去申請動態(tài)內(nèi)存..指針消亡了,并不代表它指的內(nèi)存會被自動釋放,內(nèi)存被釋放了,并不表示指針會消亡或者成了空指針..在使用malloc后,必須要free.10月20日結(jié)構(gòu)-.結(jié)構(gòu)類型:.概念:結(jié)構(gòu)由一組不同的數(shù)據(jù)組成的..定義:struct結(jié)構(gòu)名數(shù)據(jù)類型成員名1;數(shù)據(jù)類型成員名2;數(shù)據(jù)類型成員名n;};自定義類型,可省略不寫如:structstPerson 結(jié)構(gòu)定義(不分內(nèi)存)charm_szName[100];intmnAge;charm_chSex;structstBirthdaywang;);structstPersonWang={"laowang",30,'M',{1999,3,10}}二.結(jié)構(gòu)變量的定義和初始化:1.定義:structstPersonWang;//C語言中 PersonWang; 〃C++中ト丨局部對象初始化:structstPersonWang={ ;2,定義: 4structstPerson}Wang;//全局對象(一般不用,容易出現(xiàn)重復(fù)定義的錯誤)初始化:Wang={;※當(dāng)結(jié)構(gòu)名不寫的時候,必須用第二個定義方法.三.指向結(jié)構(gòu)變量的指針:.一般形式為:結(jié)構(gòu)名?結(jié)構(gòu)指針變量名;(相當(dāng)于聲明)結(jié)構(gòu)名?結(jié)構(gòu)指針變量名=&結(jié)構(gòu)變量;(相當(dāng)于定義)如:structstPerson*pWang=&Wang;.靜態(tài)內(nèi)存初始化:structstPerson*pWang={;/Z尚吳!structstPersonWang={ ;*p=Wang; //正確..動態(tài)內(nèi)存初始化:structstPerson*pWang=(structstPerson*)malloc(sizeof(structstPerson));strcpy(pWang->m_szName,"laoWang")/Z賦值.pWang->m_nAge=30;pWang->m_chSex="M';structstPerson*pWang=(structstPerson*)malloc(sizeof(structstPerson)*X);X意義:要存的結(jié)構(gòu)的數(shù)量,比如說要存三個人的資料,就寫3.清零:1.memset(pWang,0,sizeof(structstPerson)); //清整個結(jié)構(gòu).memset(pWang->m_szName,0,sizeof(pWang->szName));/Z清結(jié)構(gòu)內(nèi)的單個成員.2.利用數(shù)組:structstPersonarray[3]={0};.對結(jié)構(gòu)用函數(shù)來初始化(跟賦值ー樣):voidlnitPerson(structstPerson*_person)memset(_person->m_pName,'\0\100);_person->m_nAge=0;_person->m_chSex=、〇';).嵌套結(jié)構(gòu)的初始化:structstDate{intnYear;intnMonth;intnDay;);structstPerson(charm_szName[100];intm_nAge;charm_chSex;structstDatem_Birthday;//注意嵌套定義的格式.};structstPersonWang={"laowang",30,*M\{1999,3,10}}.結(jié)構(gòu)里雙重指針的內(nèi)存申請和釋放:structstPerson(char*m_pName;charm_chSex;/Z多一層嵌套就多一個大括號.intnAge;);structstPerson*pWang(structstPers
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 項(xiàng)目執(zhí)行成果回顧與反思報(bào)告
- 醫(yī)院國慶節(jié)活動策劃方案
- 2024年醫(yī)護(hù)管理通訊裝置項(xiàng)目投資申請報(bào)告代可行性研究報(bào)告
- 2024年高精度數(shù)字測溫儀表項(xiàng)目資金需求報(bào)告
- 2025山東港口醫(yī)養(yǎng)健康管理集團(tuán)應(yīng)屆畢業(yè)生招聘85人筆試參考題庫附帶答案詳解
- 2025國檢集團(tuán)西北運(yùn)營中心特種設(shè)備招聘(23人)筆試參考題庫附帶答案詳解
- 2025年上半年宜春市地方微小金融行業(yè)協(xié)會招考易考易錯模擬試題(共500題)試卷后附參考答案
- 2024福建福州市科技園區(qū)倉山園建設(shè)發(fā)展有限公司招聘1人筆試參考題庫附帶答案詳解
- 2025年上半年安徽黃山祁門縣縣直機(jī)關(guān)比選工作人員30人易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年螺旋錐齒輪項(xiàng)目建議書
- 2024年計(jì)算機(jī)二級WPS考試題庫380題(含答案)
- 建筑工程施工安全技術(shù)與管理課件
- 二年級下冊數(shù)學(xué)下冊第一單元
- 本科教學(xué)工作合格評估基本知識課件
- 物業(yè)管理服務(wù)大型活動服務(wù)方案
- 外科護(hù)理病歷
- 跨境電商行業(yè)深度研究報(bào)告
- 《總體國家安全觀學(xué)習(xí)綱要》全書PPT
- 軟件項(xiàng)目進(jìn)度計(jì)劃完整參考模板
- 特種設(shè)備使用單位名稱變更申請表(共2頁)
- CASS勘測定界操作指導(dǎo)方案
評論
0/150
提交評論