



版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
一.C語(yǔ)言的產(chǎn)生和發(fā)展1972年美國(guó)的DennisRitchie,最初用在UNIX下的DECPDP-11計(jì)算機(jī)。由早期的BCPL(BasicCombindProgrammingLanguage)發(fā)展而來(lái),并命名為C語(yǔ)言。ANSIC提交給ISO后產(chǎn)生ISOC(內(nèi)容基本一致):于1989年發(fā)布了第一個(gè)C的標(biāo)準(zhǔn):C89最新一個(gè)是1999年的:C99GCC/CC是具體的C編譯器二C語(yǔ)言的特點(diǎn)(原則):C是中級(jí)語(yǔ)言(它能對(duì)計(jì)算機(jī)硬件直接操作。當(dāng)然說(shuō)它是高級(jí)語(yǔ)言也對(duì))C是結(jié)構(gòu)式語(yǔ)言以函數(shù)〈注意跟數(shù)學(xué)的函數(shù)區(qū)分,它是大函數(shù)概念,形式(具體邏輯功能的載體,通過(guò)輸入?yún)?shù),進(jìn)行內(nèi)部黑箱操作,最后產(chǎn)生一個(gè)結(jié)果〈直接消化,或者返回給調(diào)用用戶(hù)〉)來(lái)組織代碼,通過(guò)循環(huán),條件等控制語(yǔ)句使程序完成結(jié)構(gòu)化C一定會(huì)有的函數(shù):main()intmain(intargc,char*argv[])//Is-1-aMATH:Y=f(x,y,z) Y=x+y*z;C:intf(intx,inty,intz)(inttemp=x+y*z;returntemp;)intmain(){intY=f(3,4,5);}//unix/linuxmain是int返回類(lèi)型,windows卜main。是void返回類(lèi)型。main。是整個(gè)程序的起點(diǎn)和入口C功能齊全,代碼精簡(jiǎn),效率高效A+=32;==>A=A+32;〃右邊A發(fā)生了兩次運(yùn)算#include<stdio.h>,具體程序中沒(méi)有用到的庫(kù)函數(shù),相關(guān)頭文件沒(méi)必要include.(包含)fabs()も#include<math.h> gcc-ImC適用范圍大##怎樣去設(shè)計(jì)程序?.從問(wèn)題實(shí)際出發(fā),寫(xiě)ー個(gè)概括性的抽象的文字描述。る業(yè)務(wù)需求.定義變量,選定函數(shù)〈確定要包含哪些頭文件〉,確定程序?qū)崿F(xiàn)的邏輯過(guò)程(算法)。〈思路〉(偽代碼)る解決方案.按照以上兩點(diǎn),依據(jù)解決問(wèn)題的順序把語(yǔ)句和函數(shù)寫(xiě)出代碼.る技術(shù)實(shí)現(xiàn)注意:不要邊想邊寫(xiě)代碼:先把主干代碼寫(xiě)出來(lái),再慢慢加枝節(jié)代碼(輸出的格式更漂亮,容錯(cuò)措施,更細(xì)的ー些功能實(shí)現(xiàn))る甚至把主干代碼部分刪了重寫(xiě)更具體的實(shí)現(xiàn)也是可以的.る代碼不是一次寫(xiě)成的!る專(zhuān)業(yè)體現(xiàn)在細(xì)節(jié)!三.變量.變量是存儲(chǔ)數(shù)值的內(nèi)存空間,所存的值可被改變(儲(chǔ)物柜:只能存固體物件,同一時(shí)間只能存一定的物體,但是不同時(shí)間可以換存別的同樣的固體物體).由于數(shù)值的類(lèi)型有多種,對(duì)應(yīng)的變量就有:整型(整數(shù))變量;浮點(diǎn)型(實(shí)數(shù))變量,和字符型變量。本質(zhì)上理解:C的數(shù)據(jù)類(lèi)型只有:int整型變量,其它的數(shù)據(jù)類(lèi)型可通過(guò)typedef類(lèi)型重定義符得以實(shí)現(xiàn)拓展。(后邊沒(méi)有確定數(shù)據(jù)類(lèi)型的變量或指針,默認(rèn)的數(shù)據(jù)類(lèi)型就是整型).有具體的存儲(chǔ)方式:靜態(tài)變量,外部變量,寄存器變量和自動(dòng)存儲(chǔ)變量(變量釋放時(shí)系統(tǒng)會(huì)登記本空間已經(jīng)空閑,但是空間所存值不會(huì)被清除)。.具體變量的標(biāo)識(shí)名,一般不代表變量空間的首地址,而是代表變量空間所存的值。(字符串變量例外).變量的聲明定義格式:存儲(chǔ)方式數(shù)據(jù)類(lèi)型變量名!,變量名2,...;注:函數(shù)體內(nèi)變量的聲明定義是合在ー起的變量的掌握要決:類(lèi)型特性(類(lèi)型拓展組合:〈形容性的關(guān)鍵字,unsigned,signed,long,short);字節(jié)長(zhǎng)度;取值范圍;存儲(chǔ)原理;表現(xiàn)形態(tài)(包括初始化,常量形態(tài),賦值等).整型變量(int):短整型(shortint)(-3萬(wàn)?3萬(wàn))(2字節(jié)),普通整型(int)(-21億?+21億)(4字節(jié)),〇可再細(xì)分有符號(hào)和沒(méi)符號(hào)的整型。.浮點(diǎn)類(lèi)型變量(double)〈表示的數(shù)值是模糊數(shù),用來(lái)存實(shí)數(shù)具體類(lèi)型:float(4字節(jié))單精復(fù)(7位有效數(shù),6位小數(shù))double(8字節(jié))雙精度(16有效數(shù),15小數(shù))longdouble(12字節(jié))長(zhǎng)雙精度注意:并沒(méi)有說(shuō)明指數(shù)多少位本類(lèi)型都是有符號(hào)的,浮點(diǎn)數(shù)主要應(yīng)用在大數(shù)或超小數(shù)的存儲(chǔ)上,它是類(lèi)似人的ー種模糊記憶模式浮點(diǎn)數(shù)的存儲(chǔ)原理:+0.314159*10"8*8=64位空間:最高位(最左側(cè))存符號(hào)(0代表正,1代表負(fù)),次高位8~11個(gè)位的空間存指數(shù)“2人n”里邊的n,剩余的位空間用來(lái)存小數(shù)部分(314159)(整數(shù)只是0,忽略)//0000101011001000.字符型變量變量中所存放的字符是計(jì)算機(jī)字符集ASCII中的字符對(duì)應(yīng)的序號(hào)。字符型變量可轉(zhuǎn)變?yōu)檎妥兞?轉(zhuǎn)換原理就是把對(duì)應(yīng)字符的ASCII碼序號(hào)作為整型值輸出A?Z:65?90 a?z:97?122’〇'?’9’:48-57還能保存一些其它的控制符號(hào):\n,\t,\b,\〇(0),...sizeof(char)=l個(gè)字節(jié)428~+127一般有符號(hào)signedcharszChar;〃也是可以u(píng)nsignedcharuzChar;〃也是OK因?yàn)樵途褪钦?/0-25511111111=1*2人7+1*2A6+1*2人5+1*2人4+1*2人3+1*2人2+1*2Al+1*2人0<-1*2A8-1=255char默認(rèn)情況下是有符號(hào)類(lèi)型三.常量是不可改變的變量:ー個(gè)沒(méi)有傳統(tǒng)變量的標(biāo)識(shí)名(它用自身的內(nèi)容值來(lái)代表自己),自動(dòng)的,臨時(shí)的,只讀的,有類(lèi)型的,存有值的內(nèi)存空間,例字符串常量。常數(shù).整型常量,有長(zhǎng)整,短整,有符號(hào),無(wú)符號(hào)。短整:一3萬(wàn)?+3萬(wàn)有二進(jìn)制,ハ進(jìn)制,十六進(jìn)制011, 0x123011U0xl23U.浮點(diǎn)型常量,也有單精度F,雙精度(默認(rèn)的浮點(diǎn)數(shù)都是雙精度),和長(zhǎng)雙精度L類(lèi)型〃實(shí)際使用時(shí)比較少用字符后綴,而用3.0浮點(diǎn)數(shù),3表示整數(shù)〃注意3.0和3在空間占用上是不同的有效位:單精度6位小數(shù),7位有效值雙精度15位小數(shù),16位有效值格式化輸出:%ffloat%Ifdouble%llflongdouble.字符型常量用‘‘單引號(hào)括上一個(gè)字符來(lái)表示一個(gè)字符常量,char字符變量空間占用永遠(yuǎn)是1個(gè)字節(jié),字符常量事實(shí)上還是被解析成整型,所以空間占用是4字節(jié)。用へ加上具體數(shù)值或字符,,表示轉(zhuǎn)義字符,例へ0,(相當(dāng)于””空字符串),'\"注意與“\n”相區(qū)分)前者常用來(lái)表示一個(gè)字符串結(jié)束了,后邊常表示換行回車(chē),、只是表示轉(zhuǎn)義,不會(huì)占用空間另外也可以用整形數(shù)字(-128?+127)作為char變量的值。5?字符串常量:字符串常量就是ー串字符(不限個(gè)數(shù)),用雙引號(hào)括起來(lái)表示,它在空間上會(huì)多占用ー個(gè)字節(jié)的空間,里邊放上、。,表小字符串結(jié)束。字符串常量的空間占用是有效字符+1??捎胹trlen()去探測(cè)具體的字符串常量或變量有效字符長(zhǎng)度。對(duì)于字符串常量可以用sizeof(字符串常量)去直接探測(cè)空間占用情況。注:strlen()是ー個(gè)函數(shù),探測(cè)也可知道它沒(méi)法加數(shù)據(jù)類(lèi)型作參數(shù)。它的工作原理:由字符串空間首地址一直向后找'。標(biāo)志,沒(méi)有碰到持續(xù)找下去,直到碰到,即使變量空間越界也不管。一串字符也可以是中文,使用的字符集可能會(huì)有:3個(gè)字節(jié):Utf-8國(guó)際共用,2個(gè)字節(jié):gb2312簡(jiǎn)體中文,Big5繁體,GBK繁體較多,簡(jiǎn)體也能用!個(gè)字節(jié):ASCII英文字母+法語(yǔ),德語(yǔ),俄羅斯語(yǔ)等西方的單字符內(nèi)容5.地址常量(指針常量)變量在內(nèi)存里的空間有對(duì)應(yīng)的地址。我們可以用地址常量來(lái)引用這些地址:intiVal;&iVal&在這里表示取地址符,作用是取出變量(或者函數(shù)或者其它數(shù)據(jù)結(jié)構(gòu))的首地址。如何輸出地址值:pintf("%p”,&iVal);選做作業(yè):把ー個(gè)字符串常量"ilovechina!“把它全部變成大寫(xiě)的方式輸出“ILOVECHINA!”。ps:。基礎(chǔ)的可以寫(xiě)偽代碼。ぐ解決方案二.運(yùn)算符單目,雙目,三目單目:i++-i ~i!i雙目:即運(yùn)算符位于兩個(gè)表達(dá)式之間a+ba+3三目:1?printf(“true”):printf("false”).賦值運(yùn)算符二(它不是數(shù)學(xué)上的簡(jiǎn)單的等式x=3+l/2*x,數(shù)學(xué)上x(chóng)=6。但是C里intx=l;x=3+l/2*x;x=3)<注意區(qū)分賦值和例始化的異同,(初始化出現(xiàn)的情況:a.變量定義時(shí)給值,b.函數(shù)參數(shù)值傳遞)//inti=0;//ぐ這是初始化(伴隨定義過(guò)程中給值或者說(shuō)變量剛分配好空間即給值)〃i=3;〃ぐ這就是賦值:將變量的舊有的值(不是垃圾值)清除,〈先了解〉動(dòng)態(tài)空間的指針變量還可能把舊的空間回收(C++里的對(duì)象的賦值),再分配ー個(gè)新的空間,再在這個(gè)新空間里給上新值.賦值語(yǔ)句:把某個(gè)常量或變量或表達(dá)式(包含有返回值的函數(shù))的值賦值給另ー個(gè)變量。它表示“等于“,而不是“是否相等“。它的符號(hào)是”二”,而不是“=="不同于數(shù)學(xué)上的:xA2+yA2=zA3x+3=5(左邊表達(dá)式與右邊表達(dá)式相等)數(shù)學(xué)上的這些方程式可以這么表示:xA2+yA2==zA2x+3==5被賦值的變量我們稱(chēng)為左值,一般它出現(xiàn)在賦值語(yǔ)句的左邊;產(chǎn)生值的常量,變量或表達(dá)式我們稱(chēng)為右值,一般它出現(xiàn)在賦值語(yǔ)句的右邊。常量一般都只能作為右值。(函數(shù)返回值其實(shí)也是ー種常量,有返回值的函數(shù)也是ー個(gè)表達(dá)式,函數(shù)有函數(shù)運(yùn)算符"()”).算術(shù)運(yùn)算符+單目正ー單目負(fù)取反,有點(diǎn)類(lèi)似!,ー用在數(shù)學(xué)運(yùn)算上注意:單目+,一都是作用在表達(dá)式結(jié)果值上面+-*/(除數(shù)不能為0) %(取余,除數(shù)不能為0)7%3=111%3=215%3=016%3=1取余應(yīng)用:表達(dá)了一個(gè)有限范圍值的概念。范圍在〇?(除數(shù)一1)之間。.邏輯運(yùn)算符:真、假(因?yàn)檎嫠哉?因?yàn)榧偎约伲?&邏輯與都成立為真I!邏輯或只要有真就是真!邏輯非將對(duì)象假的變真,真的變假(不會(huì)改變實(shí)際涉及變量的值,跟?類(lèi)似,不像自增自減)C語(yǔ)言沒(méi)有BOOL類(lèi)型,只有非。為真(別忘記負(fù)數(shù)),。為假邏輯短路現(xiàn)象.關(guān)系運(yùn)算符:(關(guān)注:大小結(jié)果:真假〈整型1,0>)><>=<=!===在條件判斷語(yǔ)句里,盡可能將類(lèi)似if(a==32);這樣的語(yǔ)句反過(guò)來(lái)寫(xiě),寫(xiě)成if(32==a);以杜絕可能存在的隱患.自增自減運(yùn)算符++a;-a;變量自身先加減1,后參與其它運(yùn)算(一次運(yùn)算)a-;a++;變量自身先參與其它運(yùn)算,整個(gè)表達(dá)式運(yùn)算結(jié)束后再變量自身加減1(兩次運(yùn)算)在復(fù)雜表達(dá)式里,對(duì)它的理解(a+++b-c)注意不要進(jìn)行++a++;運(yùn)算冃旨,厶イ故"馬:++++++--+++H ++++++a;.復(fù)合賦值運(yùn)算符+二加法賦值ー=*=/=%=?=?=&=1=A=普例:a+=2;==>a=a+2;完全等價(jià)?不是a+=2;+:只是進(jìn)行ー次運(yùn)算a=a+2;先進(jìn)行a+2,結(jié)果存在臨時(shí)空間(只讀)里,后再把臨時(shí)空間里的值取出來(lái)賦值給a.由此推向其它復(fù)合賦值運(yùn)算,都是同理.條件運(yùn)算符v表達(dá)式1>?〈表達(dá)式2〉:〈表達(dá)式3>先進(jìn)行表達(dá)式1的運(yùn)算或調(diào)用,如果邏輯上成立或?yàn)檎?則執(zhí)行表達(dá)式2的語(yǔ)句,否則執(zhí)行表達(dá)式3.逗號(hào)運(yùn)算符<〈表達(dá)式1>,〈表達(dá)式2〉,〈表達(dá)式3〉,〈表達(dá)式4>,v表達(dá)式5>...>;Z=(a=O,—b,++c,d=3,printf(?Hi4t),while(a!=l)i++,e=5,f,++++-g);intab,c=9,d,e,f;〃不是所有用到逗號(hào)的語(yǔ)句都是逗號(hào)表達(dá)式多個(gè)表達(dá)式可以用逗號(hào)分開(kāi),其中用逗號(hào)分開(kāi)的表達(dá)式的值分別結(jié)算,但整個(gè)大的表達(dá)式的值是最后一個(gè)表達(dá)式的值來(lái)代表。逗號(hào)表達(dá)式運(yùn)算優(yōu)先級(jí)最低.位運(yùn)算符(信號(hào)燈游戲)&位邏輯與兩個(gè)操作位都為1オ是1I位邏輯或只要有一個(gè)為1就為1(包含了兩個(gè)都為1也為1的情況)八位邏輯異或只要不同就為1(如果都相同,不管是不是1,都為0)〈位邏輯異〉?縣卜(位取反),運(yùn)算結(jié)果是作用在表達(dá)式結(jié)果值身上,而不是操作數(shù)自身(不是所有的單目運(yùn)算符都會(huì)作用在操作數(shù)身上)??左移右移跟乘除的關(guān)系左移n位等價(jià)于乘以2的n次方。右移n位等價(jià)于除以2的n次方。符號(hào)位是不會(huì)跟著移動(dòng),碰到最高位,會(huì)截?cái)?運(yùn)算符的優(yōu)先級(jí)和結(jié)合性結(jié)合性:又稱(chēng)為計(jì)算順序,它決定組成表達(dá)式的各個(gè)部分是否參與計(jì)算以及什么時(shí)候計(jì)算(大家優(yōu)先級(jí)ー樣時(shí):自左向右運(yùn)算,還是自右向左運(yùn)算)優(yōu)先級(jí) 運(yùn)算符 結(jié)合性最高()//Func(inta)數(shù)組口->.(連成一體) 自右向左I !~++--+-*(取內(nèi)容)&Qzeof (單目)自右向左I */% (雙目) 自左向右I +? 自左向右自左向右I ==!=>=<= 自左向右I&人1(雙目) 自左向右I &&優(yōu)先11 自左向右I?: 整體自右向左(內(nèi)部自左向右)\/ =+=-=*=/=%=&=A=|=?=?=(變態(tài)雙目,三目)自右向左最低,逗號(hào) (多目) 自左向右助記:目數(shù)越多,優(yōu)先級(jí)越低結(jié)合性由目數(shù)升級(jí),不斷由自右向左,再自左向右不斷切換特殊的:a+b*(c+d) 圓括號(hào)表示把所括內(nèi)容當(dāng)成一個(gè)表達(dá)式處理課堂作業(yè):接收用戶(hù)輸入的任意值,并由用戶(hù)指定目標(biāo)數(shù)在二進(jìn)制形態(tài)下需設(shè)置為。的位(二進(jìn)制位第幾位,),并將運(yùn)算結(jié)果值輸出。01110110第5位數(shù)的起點(diǎn)位是第〇位11011111按位與 0010000000000001不能按位異(或)01010110三.表達(dá)式和語(yǔ)句表達(dá)式:它是由常量,變量,運(yùn)算符組合(有返回值的函數(shù)也可以是組成表達(dá)式的元素)而成的語(yǔ)句,計(jì)算后會(huì)返回一個(gè)結(jié)果值。表達(dá)式可以嵌套使用,表達(dá)式內(nèi)可以又有表達(dá)式,例逗號(hào)表達(dá)式。不是所有的語(yǔ)句都是表達(dá)式,是不是表達(dá)式要看有沒(méi)有結(jié)果值.表達(dá)式返回的結(jié)果值是有類(lèi)型的。表達(dá)式隱含的數(shù)據(jù)類(lèi)型取決于組成表達(dá)式的變量和常量的類(lèi)型,或函數(shù)返回值的類(lèi)型。一般情況下,表達(dá)式內(nèi)有多種類(lèi)型時(shí),以最復(fù)雜的那個(gè)類(lèi)型為準(zhǔn),進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換(兩個(gè)結(jié)論)。每ー個(gè)表達(dá)式的返回值都具有邏輯特性:非。為真,0為假。(C++オ有邏輯類(lèi)型:bool)表達(dá)式結(jié)果值也是會(huì)有常量空間用來(lái)存儲(chǔ)值.變量、常量,表達(dá)式,函數(shù)inta=l,b=a,c=a+b;//O整體是語(yǔ)句,局部是表達(dá)式inta=b,b=l,c=b+a;//X雖然b已有內(nèi)存空間,但沒(méi)有類(lèi)型,不能準(zhǔn)確稱(chēng)為變量,還不能拿出來(lái)使用.(后果:早產(chǎn)兒)V分配空間自右向左,初始化自左向右〉棧:后進(jìn)先出想象一下ー個(gè)裝大米飯的碗語(yǔ)句:一般以分號(hào)作為結(jié)束標(biāo)志的都是語(yǔ)句,表達(dá)式是語(yǔ)句中的ー種特殊情況..標(biāo)準(zhǔn)輸入語(yǔ)句(也是ー種表達(dá)式,因有返回值)助記:用戶(hù)的鍵盤(pán)輸入和scanf函數(shù)的正式調(diào)用處理,是兩個(gè)獨(dú)立的過(guò)程.鍵盤(pán)輸入時(shí)系統(tǒng)是把用戶(hù)輸入先存入到ー個(gè)輸入緩沖區(qū)空間,最后看用戶(hù)有沒(méi)有輸入ー個(gè)scanf格式化字符串參數(shù)中多出來(lái)的一個(gè)回車(chē)符(如果字符串中有\(zhòng)n,都不會(huì)馬上進(jìn)入第二個(gè)過(guò)程的處理)Scanf和printfー樣,不會(huì)對(duì)參數(shù)做真實(shí)的類(lèi)型轉(zhuǎn)換,只會(huì)看%后邊的類(lèi)型說(shuō)明符る%d情況下,用戶(hù)輸入字符,不會(huì)被轉(zhuǎn)成整型數(shù)//scanformatintscanf(く格式化字符串〉,く可寫(xiě)變量地址表〉);int返回值表示返回函數(shù)實(shí)際接收到的正確參數(shù)的個(gè)數(shù)〃123a23.2a\n
scanf具有輸入緩沖區(qū),未處理完的用戶(hù)錄入的數(shù)據(jù),可供后面第二個(gè)scanf()使用空白字符〈空格,回車(chē)〉,多個(gè)會(huì)被轉(zhuǎn)成一個(gè),起到分隔作用。注意:空格,回車(chē)在某些情況下又是在充當(dāng)字符。非空白字符,像下面的格式化字串里的逗號(hào),也可以起到分隔符的作用(要求用戶(hù)輸入的是字符串%s時(shí),那逗號(hào)會(huì)被字符串參數(shù)吸收,容易引發(fā)大錯(cuò)誤。怎樣避免?不要加字符分隔符,scanf碰到空格,字符串輸入會(huì)自動(dòng)結(jié)束)inti;charc;floatf;scanf("%d,%c,%ド,〃等價(jià)鍵盤(pán)錄入:123,¢32.3scanf("%d%c%ド,&i,&c,&り;〃沒(méi)空白,也會(huì)等價(jià)于下面的語(yǔ)句scanf("%d%c%ド,13.88888\n空白字符,非空白字符及無(wú)字符在scanf格式字符串里都是來(lái)用起所輸入?yún)?shù)分隔作用,格式要求的作用格式轉(zhuǎn)義符號(hào)作用格式轉(zhuǎn)義符號(hào)作用%d%hd%ld十進(jìn)制有付號(hào)整數(shù)int,short,long%u%hu十進(jìn)制無(wú)符號(hào)整數(shù),無(wú)符號(hào)短整型%f%lf%llf單精度浮點(diǎn)數(shù)ノ雙精度/長(zhǎng)雙精度%s字符串(錄入的字符串仃空格,scanf就會(huì)停止繼續(xù)給值字符串參數(shù),可用fgets()...)%c單個(gè)字符%p指針的值,地址值(更多用在print。%x十六進(jìn)制數(shù)%oハ進(jìn)制數(shù)加上-表示左對(duì)齊,默認(rèn)是右對(duì)齊printf()>scanf()下的格式用法:TOC\o"1-5"\h\z%5df12 —12%-5d—12 12—%05d—12 00012%8.3f912.0 12.000注:-,前綴〇 在scanf里基本沒(méi)作用。當(dāng)在格式說(shuō)明符之間加入?時(shí),表示忽略scanf("%?3n]%*c");〃忽略用戶(hù)輸入的一切直到碰到換行符(回車(chē)),再忽略換行符用戶(hù)錄入緩沖區(qū):“adsfkaqweruvswr'n"%*c,“'上面語(yǔ)句的作用是清空用戶(hù)錄入緩沖區(qū)的數(shù)據(jù),當(dāng)緩沖區(qū)有不單有至少ー個(gè)普通字符,在后面還有\(zhòng)n,可用scanf(,,%*[A\n]%*c”);scanf后邊推薦加上:while(getchar()!='\n,);可準(zhǔn)確的清空緩沖區(qū)(一定要有一個(gè)、n)scanf()要求有一個(gè)回車(chē)符作為scanf調(diào)用返回標(biāo)志(不是用戶(hù)每次錄入回車(chē)scanf都會(huì)返回,有可能被字符型參數(shù)吸收),但是回車(chē)符并不會(huì)給scanf清除吸收(回車(chē)符在特定條件下也會(huì)被吸收,如剛好對(duì)應(yīng)%じ或%s,如果沒(méi)有被吸收,就是起分隔或觸發(fā)調(diào)用返回的作用).如果scanf在ー個(gè)循環(huán)體里,a)ー開(kāi)始它就得不到正確的參數(shù),則會(huì)死循環(huán):while(1)scanf(,,%d,,,&iV);//b)用戶(hù)如果直接回車(chē)scanf不一定會(huì)返回,0參數(shù)對(duì)于非字符參數(shù)沒(méi)有意義.還是會(huì)等待用戶(hù)輸入至少ー個(gè)非回車(chē)/非空格字符.fflush(stdin);〃無(wú)條件的強(qiáng)制清除一切輸入緩沖區(qū),局限性:相當(dāng)于拿掉緩沖區(qū),只能在VC下這么用。fflush(stdout);〃強(qiáng)制輸出緩沖區(qū)的內(nèi)容。在UC,VC下都有作用。.標(biāo)準(zhǔn)輸出語(yǔ)句intprintf(〈格式化字符串》,〈參數(shù)表〈表達(dá)式>>);int返回值表示所輸出的字符串字節(jié)長(zhǎng)度(GB2312,BIG5,GBK中文占2個(gè)字節(jié),UTF8:中文占個(gè)字節(jié),英文及符號(hào)占用1個(gè))一切函數(shù)的形參的調(diào)用順序是自右向左(還是棧的概念,后進(jìn)先此右進(jìn)先出)符號(hào)作用〃12:30:35\r 置同行最左,后面緊隨文字采覆蓋方式\xhh表示acsii碼用16進(jìn)值表示3,條件語(yǔ)句if(表達(dá)式){語(yǔ)句1;語(yǔ)句2;}if(表達(dá)式)語(yǔ)句1;elseif(表達(dá)式2)語(yǔ)句2;else語(yǔ)句3;if(表達(dá)式1)〃條件是有權(quán)重層次的,進(jìn)階關(guān)系(if(表達(dá)式2)…elseif(...)…else…;〃只有條件!成立オ可能進(jìn)行條件2之類(lèi)的判斷elseif(…)…;〃可以是平行if(.if(…)…;}〃推薦這么用###以下方式不推薦同學(xué)們使用,會(huì)讓程序?qū)哟慰勺x性變得特別差if(表達(dá)式!)if(表達(dá)式2)語(yǔ)句1;else語(yǔ)句2;〃近水樓臺(tái)先得月這個(gè)語(yǔ)句與表達(dá)式2的if語(yǔ)句相配套else語(yǔ)句3;switch(整型變量或整型常量或整型表達(dá)式)〃a(case1:語(yǔ)句1;...;語(yǔ)句n;break;〃默認(rèn)多個(gè)語(yǔ)句可以不加花括號(hào)case2:inta=0;語(yǔ)句;break;case3:{inta=l;語(yǔ)句break;}〃什么情況要用花括號(hào)〈作用域〉,不要干擾到其它條件的處理代碼Z/b語(yǔ)?J1;...;造句n;break;default:語(yǔ)句!;...;語(yǔ)句n;)//case1:case2:這些本質(zhì)上還是ー個(gè)標(biāo)號(hào)花括號(hào):1.可組合多個(gè)語(yǔ)句。把各個(gè)小語(yǔ)句組合成大的ー個(gè)語(yǔ)句,也稱(chēng)為復(fù)合語(yǔ)句,但不是表達(dá)式。.限制花括號(hào)內(nèi)的語(yǔ)句的作用域(影響區(qū)域)。.花括號(hào)內(nèi)外如果有同名的變量定義時(shí),內(nèi)部的會(huì)屏蔽外部的同名變量.循環(huán)語(yǔ)句和循環(huán)控制JumpHere:for(〈起始值設(shè)定表達(dá)表或語(yǔ)句》;〈條件表達(dá)式或語(yǔ)句〉;〈增量表達(dá)式或語(yǔ)句〉)//;這里不加;〈起始值設(shè)定〉不是〈初始化〉:C這里不能加int之類(lèi)的定義表達(dá)式JumpHere2:for(〈初始化〉;;〈增量,)(for(;;)/*無(wú)條件循環(huán)?/{if(l)break;gotoJumpHere;}if(l)continue;〃本循環(huán)緊跟的代碼不會(huì)被執(zhí)行,而是直接進(jìn)入下ー輪的循環(huán)if(0)break;)if(l)break;)JumpHere3:跳出范圍:continuev跳出本次循環(huán)〉v=breakv跳出ー個(gè)循環(huán)〉v=gotov可跳出多個(gè)循環(huán)〉.while(條件表達(dá)式)語(yǔ)句;if(l)break;do〃不管條件表達(dá)式成不成立,都先執(zhí)行一次,再判斷要不要再次循環(huán)(語(yǔ)句;}while(條件表達(dá)式);〃這里要加;作業(yè)1:求兩個(gè)整數(shù)的最大公約數(shù)。(最高效的算法)〃8,4最大公約數(shù)是4作業(yè)2:判斷一個(gè)整數(shù)是不是素?cái)?shù)?!ㄖ荒鼙?和本身整除的數(shù)是素?cái)?shù)做項(xiàng)目的兩大原則:專(zhuān)業(yè)體現(xiàn)在細(xì)節(jié)。要注意出錯(cuò)細(xì)節(jié)的處理!用戶(hù)是個(gè)頑皮的小屁孩!代碼要健壯,要能容錯(cuò)!四.數(shù)組是ー組同類(lèi)型的變量的集合體,在內(nèi)存里連續(xù)存儲(chǔ)分配。1.數(shù)組聲明(聲明不一定是定義,主要用來(lái)預(yù)告變量等相關(guān)的類(lèi)型定義信息,在代碼上后出現(xiàn)的對(duì)象的定義如何提前被前面的代碼去調(diào)用就是依靠聲明,聲明沒(méi)有初始化過(guò)程,在ー個(gè)程序里,聲明可以重復(fù)出現(xiàn)多次,有時(shí)聲明和定義格式上是ー樣)和初始化2,如何訪問(wèn)數(shù)組元素a.用下標(biāo)運(yùn)算符口去訪問(wèn)內(nèi)容(有些情況還能訪問(wèn)數(shù)組的地址)b.也可以用類(lèi)似指針(有數(shù)據(jù)類(lèi)型的內(nèi)存地址)(結(jié)合*取內(nèi)容符號(hào)的訪問(wèn)方式)的方式去訪問(wèn)數(shù)組元素3,字符數(shù)組:ー個(gè)字符數(shù)組不一定是一個(gè)字符串字符串:ー序列連續(xù)排列的字符組合,并以、0為結(jié)束標(biāo)識(shí)。字符組合不一定是字符串。輸出字符數(shù)組時(shí)要特別小心,如果不能明確里邊的內(nèi)容是不是字符串,最好不要用printf的%s去直接輸出數(shù)組??捎?FOR(i=0;i<sizeof(ary);i++)printf("%c”,ary[i]);)去打印字符數(shù)組。一般只能存一個(gè)字符串,雖然多個(gè)也可以存,但是輸出時(shí)只能以字符為單位輸入,即上述for..printf方式。作業(yè):得到用戶(hù)輸入的任意英文字符串,把它小寫(xiě)的全部變成大小,并且倒序輸出上ー不要出現(xiàn)緩沖區(qū)有多余內(nèi)容,并且含有空格也要能處理,要標(biāo)準(zhǔn)getchar():一次獲取用戶(hù)輸入的ー個(gè)字符(包括空格或回車(chē)等等)vwhile.getchar組合與scanf配套使用時(shí)才能精準(zhǔn)表示清除緩沖區(qū)的用義,其它地方有可能變成是循環(huán)等待用戶(hù)輸入,因?yàn)榫彌_區(qū)有可能為空〉strlen();獲取字符串的有效長(zhǎng)度(不含、。),如果要用它表示字符串實(shí)際在內(nèi)存中的占用情況,需:charstr[]=^^abc^^;intiStrLen=strlen(str)+l;對(duì)ー個(gè)字符串的訪問(wèn),其實(shí)是在訪問(wèn)它的首地址.多維數(shù)組多維數(shù)組不是用來(lái)存多種不同用意的數(shù)據(jù),而是用來(lái)有條理的管理多個(gè)同類(lèi)型的數(shù)據(jù)重點(diǎn)把握:a.層次關(guān)系的把握,b.地址運(yùn)算的規(guī)律.字符串?dāng)?shù)組(特殊二維字符數(shù)組,要求每ー個(gè)行存ー個(gè)字符串,末尾要加、。)〈盡管字符數(shù)組也可以在里邊保存多個(gè)的字符串,但是畢竟是ー種特殊的情況,我們所說(shuō)的字符串?dāng)?shù)組,是指非常方便的用于存儲(chǔ)多個(gè)的字符串的這么ー種用意,用來(lái)處理多個(gè)字符串的二維數(shù)組。每一行空間里至少會(huì)有一個(gè)、。..putchar(putc)/puts/(fgets)/strcpy(strncpy)/strcmp/strlen(只能用于字符,字符串操作)char*strstr(constchar*bigstr,constchar*substr)〃在ー個(gè)bigstr字符串里查找ー個(gè)substr小字符串,比較時(shí)不包含'。,如果找到就返回所找到的字符組合的首地址,否則返回NULLmemset內(nèi)存賦值或清空memcpy內(nèi)存拷貝(不限數(shù)據(jù)類(lèi)型)作業(yè)(小項(xiàng)目):實(shí)現(xiàn)ー個(gè)查找指定子字符串find_str的函數(shù),如果找到子字符串則將目標(biāo)字符串中的子字符串替換成指定的另外一個(gè)字符串desc_str,例如:abcdefg中找def,找到后替換成DEF,最后整個(gè)字符串就變成了:abcDEFg.如果沒(méi)有找到指定的子字符串,則返回一1值,否則返回一個(gè)在字符串obj.str中的所找到的首字符對(duì)應(yīng)的下標(biāo)值intstrReplace(charobj_str[],charfind_str[],chardesc_str[])//charstr[50]=^^abcdefg^^;//intpos二strReplace(str,"deF',"DEFFFFFA”);〃基本要求:實(shí)現(xiàn)等長(zhǎng)替換〃進(jìn)階要求:實(shí)現(xiàn)不等長(zhǎng)的替換(內(nèi)存操作函數(shù))〃不需理會(huì)obj_str的空間是否夠用的情況。五.函數(shù)具體邏輯功能(與數(shù)據(jù)〈局部靜態(tài)變量,)的載體,通過(guò)輸入?yún)?shù),進(jìn)行內(nèi)部黑箱操作,最后產(chǎn)生一個(gè)結(jié)果〈直接消化,或者返回值(可能一個(gè)數(shù)據(jù),也可能是一批數(shù)據(jù)??赡芡ㄟ^(guò)return(可以返回普通變量,指針或結(jié)構(gòu)變量〈ー批不同類(lèi)型的數(shù)據(jù)》),也可能通過(guò)形參的間接方式〈如形參是指向內(nèi)存的ー個(gè)首地址,一般是數(shù)組〉)給調(diào)用用戶(hù),.函數(shù)聲明和調(diào)用聲明:是對(duì)編譯器宣告有這么ー個(gè)函數(shù),它的返回值及形參變量的類(lèi)型是怎樣的,函數(shù)名是什么,即使函數(shù)體編譯器還沒(méi)有見(jiàn)到,它也可以先對(duì)調(diào)用這樣的函數(shù)的語(yǔ)句編譯放行。隱式聲明:如果ー個(gè)函數(shù)被調(diào)用前連聲明都沒(méi)有,C編譯器也能放行,不過(guò)返回值類(lèi)型就只能是int類(lèi)型。(C++不再支持隱式聲明)函數(shù)調(diào)用:運(yùn)行使用指定函數(shù)名的函數(shù),一般伴隨參數(shù)的傳遞和返回值的接收過(guò)程(不是必需)。(主調(diào)函數(shù)就是用來(lái)調(diào)用其他函數(shù)的。被調(diào)函數(shù)是被運(yùn)行調(diào)用的函數(shù))(調(diào)用函數(shù)后它的返回值的接收不是必需的,即使沒(méi)有接收也沒(méi)有關(guān)系,這個(gè)返回值會(huì)存在臨時(shí)空間里,所以也可以把有返回值的函數(shù)看作是ー個(gè)對(duì)應(yīng)返回值類(lèi)型的常量,返回的所指向的空間如果不是只讀(間接),結(jié)合一些運(yùn)算符,如?,構(gòu)成一個(gè)表達(dá)式還能充當(dāng)左值:*func()=123;)C語(yǔ)言中函數(shù)名在程序中一般必須是唯一的。也必須遵守標(biāo)識(shí)符命名規(guī)則。(C靜態(tài)函數(shù),被不同的文件包含時(shí),有時(shí)也可以允當(dāng)不同的函數(shù),因?yàn)樽饔糜虿煌?。C++函數(shù)重載:允許多個(gè)的函數(shù)名相同,但要求形參類(lèi)型或排列順序不同)v函數(shù)名,變量名,數(shù)組名,指針名都沒(méi)有自己的標(biāo)識(shí)符存放空間,包括后邊C++的引用名也ー樣,它們都只是給人看的,編譯器不需要這些,正如計(jì)算機(jī)只看二進(jìn)制,不看十進(jìn)制ー樣,UNIX一切函數(shù)都能調(diào)用自己,函數(shù)名代表了函數(shù)的首地址。(遞歸調(diào)用)函數(shù)的格式:聲明:返回值類(lèi)型函數(shù)名(形參列表v形參類(lèi)型1,形參類(lèi)型2…〉)?〃川.以沒(méi)有形參變量名。聲明作用只是告訴系統(tǒng)可以怎樣去調(diào)用這個(gè)函數(shù)聲明是給計(jì)算機(jī)看,它只需了解待調(diào)用函數(shù)的具體類(lèi)型,而不需要標(biāo)識(shí)符。只有參數(shù)類(lèi)型,沒(méi)有形參變量名的稱(chēng)為啞元,它只提供類(lèi)型信息,眼前不需要使用,常用于聲明或提供區(qū)別及兼容作用。函數(shù)的定義實(shí)現(xiàn)一般必須要有形參變量名,沒(méi)有的話(huà)就無(wú)法得到主調(diào)函數(shù)傳來(lái)過(guò)來(lái)的實(shí)參副本數(shù)據(jù)。void:沒(méi)有返回值,可以放在返回值的地方,也可以放在函數(shù)形參列表處;void*未確定實(shí)際數(shù)據(jù)類(lèi)型的指針變量,它不經(jīng)類(lèi)型轉(zhuǎn)換要做地址運(yùn)算,就是放大(縮?。?個(gè)字節(jié)(內(nèi)存空間基本單位就是1個(gè)字節(jié))。定義實(shí)現(xiàn):返回值類(lèi)型函數(shù)名(形參列表V形參類(lèi)型變量1,形參類(lèi)型變量2..〉){ー個(gè)或多個(gè)語(yǔ)句;}.函數(shù)參數(shù)的傳遞和值返回函數(shù)的形參列表內(nèi)的變量調(diào)用順序自右向左,形參變量列表的空間分配是自左向右(跟函數(shù)體內(nèi)的多個(gè)變量的空間分配及初始化順序是相反的)。函數(shù)實(shí)參向形參的傳遞和返回值本質(zhì)上是值的拷貝(即使實(shí)參變量名與形參變量名ー樣,也不是同一個(gè)變量),各個(gè)實(shí)參類(lèi)型(如果能類(lèi)型轉(zhuǎn)換也可以,不是所有類(lèi)型都能相互轉(zhuǎn)換unsigned和float)和排列順序必須與函數(shù)定義的形參列表一致。拷貝目標(biāo)是實(shí)參,拷貝的目的地是形參變量。形參變量得到的值其實(shí)是ー個(gè)實(shí)參變量值的副本,是ー個(gè)克隆體(存值的空間不同)。變量在函數(shù)體中是自下向上,自右向左分配空間。變量在函數(shù)體中的定義及初始向是自左向右。與形參的兩種順序剛好相反。當(dāng)函數(shù)定義沒(méi)有返回值類(lèi)型,甚至連void也沒(méi)有,這時(shí)C語(yǔ)言會(huì)默認(rèn)處理為返回int翹(C++沒(méi)有返回值的一般是特殊函數(shù),如構(gòu)造函數(shù)和析構(gòu)函數(shù)),例:func();fintfunc();C不像C++,可以完全沒(méi)有返回值類(lèi)型(void其實(shí)也是ー種類(lèi)型)3?可變參數(shù)的函數(shù)實(shí)現(xiàn)類(lèi)似printf(),scanf()這樣的函數(shù),里邊的參數(shù)個(gè)數(shù)是不定(限制條件:至少要有一個(gè)確定的參數(shù)〈指定數(shù)據(jù)類(lèi)型的參數(shù),在形參列表里靠左放置,)。%d%s%c%f〃告訴可變參數(shù)類(lèi)型是什么:1每一個(gè)可變參數(shù)類(lèi)型2.整體到底有多少個(gè)可變參數(shù)一般參數(shù)列表是確定的,定義時(shí)有多少個(gè)形參,調(diào)用時(shí)就必須提供多少個(gè)實(shí)參,順序要一樣,指定實(shí)參與形參對(duì)應(yīng)的數(shù)據(jù)類(lèi)型也要一致(可強(qiáng)制轉(zhuǎn)換類(lèi)型也可以)。實(shí)現(xiàn)可變參數(shù)函數(shù),需要用到ー個(gè)類(lèi)庫(kù),頭文件是stdarg.hva」ist結(jié)構(gòu)類(lèi)型〃可用來(lái)定義ー個(gè)存儲(chǔ)指向可變實(shí)參列表的結(jié)構(gòu)變量va_start,va_arg,va_end二個(gè)なva_start:告訴VA類(lèi)庫(kù)到底可變參數(shù)是由哪一個(gè)固定參數(shù)之后オ開(kāi)始(后邊都是可變參數(shù),va_start是用來(lái)定位可變參數(shù)的開(kāi)始位置)。va_arg:獲取當(dāng)前的可變參數(shù)結(jié)構(gòu)變量里的ー個(gè)實(shí)參值,并且結(jié)構(gòu)變量?jī)?nèi)部的位置指針向后自動(dòng)推進(jìn)一位(下一次再調(diào)用va_arg,得到的就是下ー個(gè)參數(shù)值)。va_end:結(jié)束操作,釋放資源???:是ー個(gè)可變參數(shù)運(yùn)算符,表示可接收不定參數(shù)(0?無(wú)限個(gè))六.變量的作用域和存儲(chǔ)類(lèi)型LC的標(biāo)識(shí)符作用域就三種:局部(不單指函數(shù),還包括內(nèi)部的像循環(huán)體等{}內(nèi)的作用域)全局(一般指放在函數(shù)外邊的ー些變量):在多個(gè)互不include的文件中都有作用,不過(guò)這個(gè)作用要靠extern聲明去揭示文件〈沒(méi)有被include的文件オ是不同的文件,:作用域只限文件自身內(nèi)部。作用域:它決定了程序中的哪些語(yǔ)句可以使用該變量,或函數(shù),結(jié)構(gòu)體等等對(duì)象2.各種同名變量作用域的優(yōu)先順序:下層花括號(hào)語(yǔ)句體〉,上層函數(shù)體〉〉全局/文件(優(yōu)先級(jí)高的屏蔽低的同名變量)2.2生命期:全局〉=文件〉二函數(shù)〉:下層花括號(hào)語(yǔ)句體3.變量的存儲(chǔ)類(lèi)型(生命期,作用域)自動(dòng)(auto)〈生命結(jié)束時(shí),有系統(tǒng)善后,自動(dòng)由系統(tǒng)回收內(nèi)存空間資源,原理:只是登記這片內(nèi)存空間已是空閑狀態(tài),并沒(méi)有去清除空間所存的內(nèi)容值。編譯器默認(rèn)變量就是auto類(lèi)型〉。靜態(tài)(static)〈生命期如本進(jìn)程一樣長(zhǎng),靜態(tài)不是只讀的意思,表達(dá)了一個(gè)生命如進(jìn)程的概念,如果它放在函數(shù)外邊,變量加了static就是在限定變量的作用域?yàn)楸疚募拇a中會(huì)有作用。另外如果static加在函數(shù)的局部變量里,則它的作用域就只限在該函數(shù)內(nèi)部〉,外部(extern)〈生命如進(jìn)程,作用域是全局的,不限具體哪ー個(gè)文件,但是引用這個(gè)變量的文件需要聲明有這個(gè)全局變量,就是用extern聲明當(dāng)前這個(gè)全局變量是由外部文件的全局區(qū)域定義的這么個(gè)全局變量〉,寄存器(register)〈除了程序無(wú)法得到其內(nèi)存地址外,其余和自動(dòng)變量ー樣,有遞交申請(qǐng)為VIP身份這樣的含義〈不一定能申請(qǐng)成功,不成功則作為普通變量,選做作業(yè):使用可變參數(shù)技術(shù),實(shí)現(xiàn)各個(gè)可變參數(shù)成員的值的累加效果,最后把等式顯示出來(lái),并打印累加的結(jié)果值const表示只讀,加了這個(gè)關(guān)鍵字,變量的空間就只能讀不能寫(xiě),那唯一的一次寫(xiě)的機(jī)會(huì)是在變量的初始化時(shí)volatile易變的(實(shí)時(shí)更新的),不需要進(jìn)行優(yōu)化處理,有變化,不要保留,馬上反應(yīng)七.遞歸函數(shù)遞歸的意思是函數(shù)自己調(diào)用自身(直接方式),或者在自己函數(shù)調(diào)用的下級(jí)函數(shù)中又調(diào)用自己(間接方式)。//F(){F();}//F(){F();F();}//F(){E();} E(){F();}〃可讀性差,變態(tài)的,遞歸:可拆分為遞(向下層傳遞參數(shù))和歸(函數(shù)不再向下傳遞時(shí)會(huì)ー層ー層的返回)兩個(gè)過(guò)程〈類(lèi)似ー個(gè)人在大廈里爬樓梯,爬到頂層了沒(méi)事可干,再ー層ー層爬回地面(注意層次不要搞混),遞歸與循環(huán)的異同,請(qǐng)參考示圖。寫(xiě)遞歸函數(shù)需考慮的要素:a,怎樣取ー個(gè)變量或多個(gè)往下遞歸(不是絕對(duì),但是推薦這么做,變量在傳遞中要有變化)b.怎樣終止遞歸,要設(shè)置ー個(gè)合理的終止條件(原來(lái)的規(guī)律不能成立,函數(shù)遞歸層的代碼不再重復(fù))c.遞歸過(guò)程中的臨時(shí)或中間結(jié)果怎樣保存(例:遞歸函數(shù)的靜態(tài)局部變量,或用ー個(gè)變量參數(shù)將它再傳下去,變量可以變得更高效和精簡(jiǎn)),不是每一個(gè)遞歸都需考慮這個(gè)情況。注:遞歸函數(shù)沒(méi)有限制函數(shù)體里可以調(diào)用多少次自身,但是物理硬件決定了他還是會(huì)有一個(gè)極限,盡量不要超過(guò)26萬(wàn)次(UNIX)在ー個(gè)遞歸函數(shù)體內(nèi)部可有多種的遞歸調(diào)用副本,每ー個(gè)副本傳遞的參數(shù)不同。例:func(n){if(n<l)return;func(n-l);func(n-2);func(n-3);return;}遞歸思維(怎樣用遞歸解決有規(guī)律可循的一些問(wèn)題)A.找到ー個(gè)有規(guī)律可尋的問(wèn)題的解決方案的ー個(gè)典型的環(huán)節(jié)(層面),只考慮這ー個(gè)層面的代碼應(yīng)該如何實(shí)現(xiàn)(由點(diǎn)到面,這個(gè)點(diǎn)是有普遍代表性的)B.在這一個(gè)層面里只考慮a.參數(shù)變量如何設(shè)置,如何變化傳遞。b.終止條件語(yǔ)句如何寫(xiě),也就是不再遵守典型規(guī)律的那些情況如何變成代碼上的終止條件。c.仔細(xì)調(diào)整一下需輸出文字信息放在遞的過(guò)程和歸的過(guò)程的情況,不要出現(xiàn)重復(fù)打印的情況結(jié)論:遞歸思維本質(zhì)特點(diǎn)是暫時(shí)忽略各個(gè)層次實(shí)現(xiàn)的不同細(xì)節(jié),而只關(guān)注固定的某ー環(huán)節(jié)的較大過(guò)程實(shí)現(xiàn)即可(有規(guī)律性的.例外情況不會(huì)太多的問(wèn)題,適合用遞歸來(lái)實(shí)現(xiàn))作業(yè):實(shí)現(xiàn)漢諾塔的功能,將由小環(huán)到大環(huán)堆放的多個(gè)環(huán)(大環(huán)上邊可放小環(huán),小環(huán)下邊不能放比它小的環(huán))從ー個(gè)位置搬到另ー個(gè)位置的算法,另外只提供ー個(gè)緩沖位置(整體就三個(gè)位置空間)。把搬運(yùn)具體環(huán)(第幾環(huán))的過(guò)程打印出來(lái)(文字清單輸出舉例:將第幾個(gè)環(huán)由哪ー個(gè)位置搬到哪ー個(gè)位置。將第幾個(gè)環(huán)由哪ー個(gè)位置搬到哪ー個(gè)位置。。。),第N環(huán)比第N-1環(huán)要大intmain(intargc,char*argv[])ハ.預(yù)處理預(yù)處理過(guò)程掃描源代碼,對(duì)其進(jìn)行初步的轉(zhuǎn)換,產(chǎn)生新的源代碼提供給編譯器??梢?jiàn)預(yù)處理過(guò)程先于編譯器對(duì)源代碼進(jìn)行處理。(預(yù)處理不是真正的程序:預(yù)處理處理的是文本,產(chǎn)生的結(jié)果仍然是文本)預(yù)處理指令是以#號(hào)開(kāi)頭的代碼行,結(jié)束不需要加;號(hào)。指令用途#空指令無(wú)任何效果,類(lèi)似空行#include包含一個(gè)源代碼文件#define定義宏#undef取消已定義的宏〈后邊方便可以再次使用同名的宏標(biāo)識(shí)符再去替代其它的內(nèi)容〉#if如果條件為真,就編譯下面代碼(一般跟常量或宏)#else跟#if等條件判斷預(yù)處理指令配套使用,相當(dāng)于程序里的else類(lèi)似作用。上面條件都不成立,則編譯下面的代碼#ifdef如果宏已定義,則編譯下面代碼v不關(guān)心宏有沒(méi)有值,或值是真還是假,只要有定義這么ー個(gè)宏,ifdef就認(rèn)為是真,#ifndef 如果宏未定義,則編譯下面代碼#elif 如果前面的#if條件為假,當(dāng)前條件為真,則編譯下面代碼
(一般跟常量或宏)velseif>#endif結(jié)束ー個(gè)#iL..#else條件編譯塊或#ifndef#ifdef#endif存在這ー個(gè)預(yù)處理命令是因?yàn)轭A(yù)處理不支持{}預(yù)處理符號(hào)#error 停止編譯并顯示錯(cuò)誤信息#line 可以將#line下文代碼重編行號(hào)#運(yùn)算符 稱(chēng)為字符串轉(zhuǎn)換運(yùn)算符(要用在預(yù)處理語(yǔ)句里):##運(yùn)算符 (用在預(yù)處理行語(yǔ)句)程序調(diào)試需要用到的宏指令(系統(tǒng)預(yù)定義好的宏)_LINE_#line指令可以改變它的值,簡(jiǎn)單說(shuō),編譯時(shí),它包含程序的當(dāng)行行數(shù)FILE指代代碼所在的文件名FILE_FUNCTION_指代當(dāng)前正在運(yùn)行的函數(shù)_DATE_ 宏指令表示源文件被翻譯到正式代碼時(shí)的日期(字符串)_TIME_ 程序編譯的時(shí)間(字符串)_STDC_ 如果_STDC一已經(jīng)定義,如果編譯器是用GCC編譯代碼,這個(gè)宏會(huì)為1,如果是用G++或其它編譯,它不為1。_CPLUSPLUS_與標(biāo)準(zhǔn)C++一致的,編譯器把它定義為ー個(gè)包含致少6位的數(shù)值。與標(biāo)準(zhǔn)C++不一致,編譯器將使用具有5位或更少的數(shù)值。九.指針(掌握的重點(diǎn):首地址,因子,層次,不能代表所指向空間的整體占用,ロ/*/&)指針概念1.指針基本概念及其指針變量的定義(指針變量簡(jiǎn)稱(chēng)為指針)指針是這樣ー個(gè)特殊的數(shù)據(jù)類(lèi)型,這個(gè)指針變量用來(lái)存放其它變量的地址,同時(shí)還點(diǎn)明了所指向變量的數(shù)據(jù)類(lèi)型(讓因子vl字節(jié)單位的倍數(shù)〉有著落〈void?類(lèi)型因子是1個(gè)字節(jié)<1倍〉,內(nèi)存空間最小單位〉)。(a.首地址:獲悉怎樣去操作指定的變量空間b.數(shù)據(jù)類(lèi)型〈因子》:獲悉地址運(yùn)算能怎樣進(jìn)行)〃〇X124fflevー這是ー個(gè)!6進(jìn)制的整型常量還是ー個(gè)地址常量???表面看不出//inta,&avー這就是地址常量v一地址常量可看成是一個(gè)指針常量〃這里有點(diǎn)明數(shù)據(jù)類(lèi)型ー個(gè)指針變量在內(nèi)存中占用4個(gè)字節(jié)。(指針變量的自身內(nèi)容空間不是指指針是int類(lèi)型,而是剛好它也占用4個(gè)字節(jié),指針的類(lèi)型(為何指針要仃數(shù)據(jù)類(lèi)型:要確定因子)取決于定義時(shí)給定的數(shù)據(jù)類(lèi)型)char*a;sizeof(a)==?4//a指針變量的自身的內(nèi)存空間有多少char*a=^^abc^^sizeof(*a)=?1〃指針?biāo)赶虻目臻g大小(因子),不是取決于空間的內(nèi)容,而是指定定義時(shí)的數(shù)據(jù)類(lèi)型(char)不管指針?biāo)赶虻氖鞘裁磾?shù)據(jù)類(lèi)型,他自身的空間占用就是4個(gè)字節(jié)類(lèi)型標(biāo)識(shí)符?指針變量1,普通變量L?指針變量2,普通變量2; 〃?在這里表示定義指針,修飾只起一次作用?在其它語(yǔ)句表示取空間的內(nèi)容值,獲取變量所在空間。如果這個(gè)空間不是只讀的,還可以直接作為左值左值概念本質(zhì):可被改寫(xiě)的空間才能充當(dāng)左值void*p;〃未確定數(shù)據(jù)類(lèi)型的指針,一般沒(méi)有辦法直接用,使用前最好做強(qiáng)制類(lèi)型轉(zhuǎn)換,一般出現(xiàn)在函數(shù)形參或返回值V泛型編程的思路。代碼的復(fù)用性增強(qiáng),。要用時(shí)需將它轉(zhuǎn)換為有具體數(shù)據(jù)類(lèi)型其它指針。Char*p=(char*)malloc(1)'JImalloc返回了一?個(gè)已分配好的ー個(gè)字節(jié)的空間,這個(gè)空間類(lèi)型未定,所以返回的指針類(lèi)型是void?我們這里是強(qiáng)制給他轉(zhuǎn)換成char類(lèi)型。C中規(guī)定,當(dāng)指針值為〇(NULL)時(shí),指針不指向任何有效數(shù)據(jù),這時(shí)可稱(chēng)為空指針。有時(shí)也常用NULL來(lái)指示函數(shù)調(diào)用中某些錯(cuò)誤情況的發(fā)生。指針變量定義,一直到被調(diào)用過(guò)程中都沒(méi)有給它賦過(guò)值。這樣的指針可稱(chēng)為野指針,他的值是垃圾值。但有時(shí)垃圾值對(duì)應(yīng)內(nèi)存地址還是有內(nèi)容。這樣直接去使用非常容易出嚴(yán)重問(wèn)題,所以要避免野指針的情況出來(lái)。不指向具體變量地址時(shí),給他賦上NULL不要將一個(gè)整數(shù)賦值給指針變量,同樣也是因?yàn)橹羔樀囊蜃訜o(wú)法確定,如果值所代表的空間類(lèi)型并不是指針定義時(shí)的類(lèi)型,這時(shí)的使用非常容易出錯(cuò)2?地址運(yùn)算(不是簡(jiǎn)單的算術(shù)運(yùn)算,還可以是多層面的地址運(yùn)算〈多維,多級(jí))a.比較:兩個(gè)指針指向同一個(gè)對(duì)象(數(shù)組)時(shí)才有意義。b,指針和整數(shù)加、減運(yùn)算:(放大因子〈具體放大多少字節(jié)取決于指針的類(lèi)型,會(huì)起作用)c.兩個(gè)指針變量間減法運(yùn)算:運(yùn)算結(jié)果表示元素個(gè)數(shù)相差。 (縮小因子會(huì)起作用)〈需要指向同一個(gè)數(shù)組,并且要層次一致(不要把行的因子和列的進(jìn)行減法運(yùn)算》トー.數(shù)組和指針任何能由數(shù)組下標(biāo)完成的操作也都可以用指針來(lái)實(shí)現(xiàn)。任何指針能完成的操作如果要轉(zhuǎn)換成數(shù)組下標(biāo)來(lái)實(shí)現(xiàn),要依據(jù)具體情況而定,不一定可行。(老夫的錢(qián)都是老妻的,老妻的錢(qián)不一定是老夫的)(我的就是你的,你的還是你的)a)指向數(shù)組元素的指針〈不要把數(shù)組名的第二屬性(整體空間占用)跟因子混淆起來(lái),因子是單位空間大小〉公式:a[i]==*(a+i)==*(p+i)==p[i]//a是數(shù)組,p是指針其實(shí)數(shù)組的下標(biāo)值就是地址運(yùn)算要用到的整數(shù)這里的前提:因子必須一致,層次必須一致b)指向二維數(shù)組的指針二維數(shù)組元素的地址int<5][3];a[i][j]==*(a[i]+j)==*(*(a+i)+j)〃注意==(*(a+i))[j]//a是整個(gè)的數(shù)組名注意:不要把(*(a+i))[j]寫(xiě)成?(a+i)[j](ロド標(biāo)運(yùn)算符是運(yùn)算符,優(yōu)先級(jí)比*高)下標(biāo)運(yùn)算符不一定表示內(nèi)容值,而可能是地址值,所以可以這么認(rèn)識(shí)?,&丄]只是用來(lái)表示一個(gè)具體的層次問(wèn)題(多維數(shù)組的層次,例二維數(shù)組兩層:行,歹リ,隱性的ー層是數(shù)組名那ー層,列是內(nèi)容層),?」]是向下ー層運(yùn)算(最后一層一定是內(nèi)容層,如果不是最后ー層,那得到的將是地址值),&向上一層運(yùn)算(有時(shí)沒(méi)有辦法順利推進(jìn))。(它取到的永遠(yuǎn)是地址值)數(shù)組指針(變量):指針變量指向ー個(gè)由n個(gè)元素所組成的數(shù)組(把數(shù)組看成是ー個(gè)運(yùn)算單元(因子是ー個(gè)數(shù)組類(lèi)型),跟字符指針,整型指針沒(méi)什么兩樣)一般會(huì)用數(shù)組指針來(lái)指向一個(gè)二維數(shù)組,運(yùn)算時(shí)比較方便,它的因子和二維數(shù)組的數(shù)組名的因子ー樣大,所以可以管理二維數(shù)組,能表示的層面有一致性。一個(gè)二維數(shù)組指針可以用來(lái)管理一個(gè)三組數(shù)組intmain(intargc,char*argv[])intmain(intargc,char**argv)有限制的つintmain(intargc,charargv[10][10])只要確保空間是連續(xù)的,因子是一致的,就可指針,數(shù)組互換格式:數(shù)據(jù)類(lèi)型(?標(biāo)識(shí)符)[n];〃類(lèi)型?n就是指針的因子在原有因子(數(shù)據(jù)類(lèi)型)基礎(chǔ)上再進(jìn)ー步進(jìn)行放大。比如:將指針?lè)糯蟪删哂卸S數(shù)組名單位行的跨度(因子),像inta[5][3].那就必須在因子(整型)基礎(chǔ)上再放大3倍,這樣對(duì)應(yīng)的數(shù)組指針定義就是int(*p)[3];如何把一個(gè)數(shù)組指針指向一個(gè)ー維數(shù)組?看例子十二.字符指針charstrロゴ我是ー個(gè)字符串”;char*p="我是ー個(gè)字符串”;ー個(gè)字符串常量代表了自身的首地址,也代表了他自己整體一個(gè)空間占用。(跟數(shù)組名類(lèi)似)ー維數(shù)組和字符字針在層次上是ー樣的(因子都是1),不同點(diǎn)在于數(shù)組還具備數(shù)據(jù)空間,指針只有地址空間,數(shù)組有第二屬性,指針沒(méi)有。十三.指針數(shù)組它是ー個(gè)數(shù)組格式:數(shù)據(jù)類(lèi)型?數(shù)組名E];〃不管是什么類(lèi)型,因子都是4,因?yàn)樵厥侵羔樧兞俊ㄋ葦?shù)組指針變量少了一層主要使用在多個(gè)字符串的處理上面。使用字符串?dāng)?shù)組(二維數(shù)組)對(duì)處理長(zhǎng)度不等的字符串效率低,而且有局限性〈長(zhǎng)度有限〉。而指針數(shù)組由于每個(gè)元素都是指針變量,故通過(guò)地址運(yùn)算來(lái)操作各個(gè)字符串(行),是十分方便,每ー個(gè)指針元素可指向不定長(zhǎng)的字符串(字符串與字符串之間的空間存放是不連續(xù)的,也即是說(shuō)指針數(shù)組語(yǔ)法上雖然可以轉(zhuǎn)換成二維數(shù)組,但邏輯不對(duì),不過(guò)可以把它轉(zhuǎn)換成二級(jí)指針〈數(shù)組本來(lái)就是由指針演變出來(lái)的〉)。intmain(intargc,char*argv[])//argumentcount//argumentvariable作業(yè):實(shí)現(xiàn)ー個(gè)微型的mis(信息管理系統(tǒng)),保存QQ個(gè)人資料(姓名,QQ號(hào),性別)。可以接受用戶(hù)輸入Q友個(gè)人資料,顯示所有的Q友資料項(xiàng)(不定個(gè)數(shù)的Q友資料)。用上自動(dòng)動(dòng)態(tài)結(jié)構(gòu)數(shù)組或動(dòng)態(tài)分配堆容間:unsignedtotal=0;structstudent*pStu=NULL;while(...){…〃接收用戶(hù)輸入Q友資料Structstudenttmp={...};〃把用戶(hù)的輸入分別列入初始化項(xiàng)目Structstudent*tmpStu=pStu;pStu=(structstudent*)malloc(++total*sizeof(structstudent));memcpy(pStu,tmpStu,sizeof((total-1)*sizeof(structstudent));memcpy(pStu+total,&tmp,sizeof(tmp));if(NULL!=tmpStu){free(tmpStu);tmpStu=NULL;}〃再問(wèn)用戶(hù)是否仍需輸入)〃現(xiàn)實(shí)意義:可以實(shí)現(xiàn)在未知元素個(gè)數(shù)情況下的數(shù)據(jù)存儲(chǔ)。十四.指針函數(shù)和函數(shù)指針L指針函數(shù)(注意不要返回一個(gè)局部變量的地址值,不然程序不可能有高品質(zhì),高性能,會(huì)有不定時(shí)的炸彈隱患。不是說(shuō)不能定義ー個(gè)局部指針變量來(lái)返回它所存的指針值,而是說(shuō)這個(gè)指針變量所存的地址值所指向的空間不應(yīng)該是局部的)當(dāng)ー個(gè)函數(shù)聲明其返回值為ー個(gè)指針時(shí),實(shí)際上是返回一個(gè)指針值給調(diào)用函數(shù)。這樣的函數(shù)可稱(chēng)為指針函數(shù)。數(shù)據(jù)類(lèi)型?函數(shù)名(形參列表)2.函數(shù)指針指向函數(shù)的指針包含了函數(shù)的地址,可以通過(guò)它來(lái)調(diào)用函數(shù)。格式:函數(shù)的數(shù)據(jù)類(lèi)型ド函數(shù)指針標(biāo)識(shí)符)(形參列表〈可以是啞元〉)把函數(shù)的地址賦值給函數(shù)指針:void(*pfunc)();pfunc二&func;〃后邊不加圓括號(hào)表示函數(shù)地址pfunc二func;〃也可不加通過(guò)指針調(diào)用函數(shù):(*pfunc)();pfunc();〃如果有實(shí)參,也要加上十五.指針的指針(二級(jí)指針)指針變量里的值是另ー個(gè)指定數(shù)據(jù)類(lèi)型指針變量的地址,這樣稱(chēng)為指針的指針二級(jí)指針即可以用來(lái)表示存儲(chǔ)另ー個(gè)ー級(jí)指針變量的作用,還可以用來(lái)管理一個(gè)二維數(shù)組。前者層次只有兩層,后者有三層(層次的劃分看實(shí)際應(yīng)用事實(shí)而定)數(shù)據(jù)類(lèi)型??標(biāo)識(shí)符;TIPS:指針+所指向的空間ッ數(shù)組指針,數(shù)組等對(duì)象的層次由類(lèi)型定義去確定,沒(méi)有空間存這個(gè)層次關(guān)系利用指針的指針可以允許被調(diào)用函數(shù)修改局部指針變量?jī)?nèi)容值〈地址值局部指針實(shí)參的所指向的變量或空間的內(nèi)存地址值,和處理指針數(shù)組(注意是變量本身而不是變量給出的數(shù)值)規(guī)律:要修改變量實(shí)參的內(nèi)容值,被調(diào)函數(shù)定義形參時(shí)注意要在實(shí)參類(lèi)型上再退ー層(由內(nèi)容表現(xiàn)層退到行地址層,內(nèi)容表現(xiàn)層又是指針類(lèi)型時(shí),即是說(shuō)形參應(yīng)該定義成二級(jí)指針)十六.指向指針數(shù)組的指針經(jīng)常可以用指針數(shù)組來(lái)代替多維數(shù)組(二維數(shù)組)。指針需要關(guān)注內(nèi)容:變化因子;地址運(yùn)算;十七.結(jié)構(gòu)體(結(jié)構(gòu)體的使用可看作是ー個(gè)大型的普通變層G但是數(shù)組不能這么被用,區(qū)別:數(shù)組元素個(gè)數(shù)未定,而結(jié)構(gòu)成員類(lèi)型和數(shù)量都已固定)結(jié)構(gòu)是由基本數(shù)據(jù)類(lèi)型構(gòu)成的,并用ー個(gè)標(biāo)識(shí)符來(lái)命名的各種變量的組合。結(jié)構(gòu)體中可以使用不同數(shù)據(jù)類(lèi)型。數(shù)據(jù)庫(kù)或電子表格里的ー個(gè)數(shù)據(jù)表,應(yīng)用結(jié)構(gòu)是比較常見(jiàn)。.結(jié)構(gòu)說(shuō)明和結(jié)構(gòu)變量的定義及初始化struct結(jié)構(gòu)名〈可省略,只在ー個(gè)函數(shù)中使用的結(jié)構(gòu),只是用一次,就是臨時(shí)結(jié)構(gòu),typedef>〃這里是設(shè)計(jì)出結(jié)構(gòu)類(lèi)型(數(shù)據(jù)類(lèi)型成員標(biāo)識(shí)名;數(shù)據(jù)類(lèi)型成同標(biāo)識(shí)名2;}結(jié)構(gòu)變量名;〃分號(hào)不能省略結(jié)構(gòu)的使用:先設(shè)計(jì)出結(jié)構(gòu)類(lèi)型,再定義結(jié)構(gòu)變量。結(jié)構(gòu)本身是ー種數(shù)據(jù)類(lèi)型,跟int,char差不多,只不過(guò)它內(nèi)部復(fù)合了其它的一些子類(lèi)型,用結(jié)構(gòu)類(lèi)型定義出來(lái)的變量跟用int定義出來(lái)的變量除了類(lèi)型不一樣,其它的用法都一樣,在函數(shù)中可以被直接傳遞,也可以被直接返回,不像數(shù)組變量要透過(guò)傳遞首地址,交待個(gè)數(shù)オ能間接傳遞。struct結(jié)構(gòu)名:用來(lái)定義ー種結(jié)構(gòu)數(shù)據(jù)類(lèi)型標(biāo)識(shí)符。可將:struct結(jié)構(gòu)名替換成typedefstruct{…}結(jié)構(gòu)數(shù)據(jù)類(lèi)型名 ぐ后邊再定義它的變量時(shí),就可以直接:結(jié)構(gòu)類(lèi)型名變量名;原先:struct結(jié)構(gòu)名,結(jié)構(gòu)變量名typedef關(guān)鍵字表示數(shù)據(jù)類(lèi)型重定義,換名。可簡(jiǎn)化原有類(lèi)型名的書(shū)寫(xiě)。作用跟原有類(lèi)型是ー樣的。結(jié)構(gòu)變量的初始化可像數(shù)組那樣用{}進(jìn)行初始化。.結(jié)構(gòu)變量的使用:(結(jié)構(gòu)變量沒(méi)有辦法被直接使用,更多是指調(diào)用結(jié)構(gòu)變量的成員)主要也是在用結(jié)構(gòu)變量里的成員進(jìn)行相關(guān)操作。結(jié)構(gòu)變量.成員變量名.結(jié)構(gòu)數(shù)組.結(jié)構(gòu)指針調(diào)用格式:結(jié)構(gòu)指針つ成員變量名要注意:成員變量不是指針?biāo)械?而是指針?biāo)赶虻慕Y(jié)構(gòu)變量實(shí)體的成員。調(diào)用格式:(?結(jié)構(gòu)指針).成員變量名(類(lèi)似下標(biāo)運(yùn)算符的轉(zhuǎn)換,只是這里轉(zhuǎn)換).結(jié)構(gòu)的嵌套形式結(jié)構(gòu)里又有結(jié)構(gòu)成員,有數(shù)組成員等等,C結(jié)構(gòu)里不能有函數(shù)成員,C++可以。.結(jié)構(gòu)的參數(shù)和返回值的傳遞:像普通變量那樣進(jìn)行值的傳遞,而不需要像數(shù)組那樣,傳遞首地址,還需要指針的協(xié)助。還可以直接用ー個(gè)結(jié)構(gòu)變量給另ー個(gè)結(jié)構(gòu)變量賦值。.結(jié)構(gòu)體的內(nèi)存對(duì)齊在默認(rèn)情況下,為了方便對(duì)結(jié)構(gòu)體內(nèi)元素的訪問(wèn)和管理,加快處理速度。當(dāng)結(jié)構(gòu)體內(nèi)的成員(數(shù)組成員會(huì)進(jìn)行拆分成基本類(lèi)型)的長(zhǎng)度都小于處理器的位數(shù)(32位,4字節(jié))的時(shí)候,便以結(jié)構(gòu)體里面:A.最長(zhǎng)的數(shù)據(jù)類(lèi)型的成員為對(duì)齊單位,超過(guò)CPU的,以CPU字長(zhǎng)為準(zhǔn)(32位,4個(gè)字節(jié)長(zhǎng))B.保證結(jié)構(gòu)體內(nèi)相同的連續(xù)數(shù)據(jù)類(lèi)型空間內(nèi)部不進(jìn)行對(duì)齊(數(shù)組,或多個(gè)同類(lèi)型成員依次定義,中間不夾其他類(lèi)型成員)C.從節(jié)約空間的原則入手,能湊成一個(gè)對(duì)齊單位而又不影響B(tài)點(diǎn)的,就以此進(jìn)行空間拼湊處理D.結(jié)構(gòu)體的長(zhǎng)度一定是最長(zhǎng)的數(shù)據(jù)元素的整數(shù)倍。注意:成員地址最好落在偶數(shù)地址上//progmapack(n)結(jié)構(gòu)體內(nèi)類(lèi)型相同的連續(xù)元素將在連續(xù)的空間內(nèi),和數(shù)組ー樣。.位段位段是比字節(jié)還要小的單位,它只有。和1的表示方式,單位是位。具體有多少位也就形成了位段。結(jié)構(gòu)體允許我們給每ー個(gè)成員進(jìn)行空間位段的限定,以達(dá)到節(jié)省空間,或局部修改數(shù)據(jù)存儲(chǔ)空間的目的。具體位段使用中的限制,請(qǐng)參考:struct bitdomain.c例子。作業(yè):把上一次的作業(yè)(QQ相關(guān))用結(jié)構(gòu)來(lái)動(dòng)態(tài)實(shí)現(xiàn),在加上一個(gè)QQ會(huì)員簡(jiǎn)介成員(不定長(zhǎng)度,但有最大上限)。要求盡可能的動(dòng)態(tài)壓縮結(jié)構(gòu)(網(wǎng)絡(luò)數(shù)據(jù)包的傳輸)的空間占用。#include<stdio.h>〃工作中的結(jié)構(gòu):typedefstruct〃加上其它成員longsize;〃統(tǒng)計(jì)個(gè)人簡(jiǎn)介動(dòng)態(tài)堆空間長(zhǎng)度char*introduce;〃個(gè)人簡(jiǎn)介max:500K}working_data;〃進(jìn)程內(nèi)的結(jié)構(gòu)定義voidtemp=malloc(size);〃動(dòng)態(tài)分配不能超過(guò)結(jié)構(gòu)的intruduce成員的上限data*data=(data)temp;memcpy(data->introduce.str,size);客戶(hù)端/服務(wù)器端本地結(jié)構(gòu)(要把結(jié)構(gòu)體寫(xiě)到硬盤(pán)):typedefstruct(〃加上其它成員longsize;〃統(tǒng)計(jì)個(gè)人簡(jiǎn)介動(dòng)態(tài)堆空間長(zhǎng)度charintroduce[500*1024];〃個(gè)人簡(jiǎn)介max:500K要寫(xiě)進(jìn)硬盤(pán)時(shí)不能用指針成員,需要等長(zhǎng)的成員空間。為什么不能用指針成員?}local_data;〃進(jìn)程內(nèi)的結(jié)構(gòu)定義十八.聯(lián)合表示幾個(gè)變量共用ー個(gè)內(nèi)存空間,在不同的時(shí)間保存不同的數(shù)據(jù)類(lèi)型和不同長(zhǎng)度的變量。而且同一時(shí)間只保存ー個(gè)。union聯(lián)合名數(shù)據(jù)類(lèi)型成員名;數(shù)據(jù)類(lèi)型成員名;)聯(lián)合變量名;union空間使用更接近于realloc(重新分配空間)其長(zhǎng)度一般為union中最大的成員變量長(zhǎng)度。Union變量:聯(lián)合變量名.成員名Union指針: 聯(lián)合指針つ成員名(?聯(lián)合指針).成員名同一時(shí)間只有一個(gè)成員變量在起作用。其它成員變量如要使用(不是賦值操作),其實(shí)是在進(jìn)行形態(tài)轉(zhuǎn)換(不是類(lèi)型轉(zhuǎn)換,值相差不多才是類(lèi)型轉(zhuǎn)換)?!ò巡荒茴?lèi)型轉(zhuǎn)換的也能輸出十九?枚舉是ー個(gè)被命名的整型常數(shù)的集合。enum枚舉名標(biāo)識(shí)符匚整型常數(shù)],〃整型常數(shù)亦可省略標(biāo)識(shí)符匚整型常數(shù)],〃使用中可把標(biāo)識(shí)符單獨(dú)看作是ー個(gè)獨(dú)立的整型常量(constint,宏)???標(biāo)識(shí)符匚整型常數(shù)],}枚舉變量;enum的使用:直接用枚舉內(nèi)部文本標(biāo)識(shí)符即可,不需要加枚舉變量名。如果枚舉沒(méi)有初始化,即省略二整型常數(shù)時(shí),則從第一個(gè)標(biāo)識(shí)符開(kāi)始,順次賦給標(biāo)識(shí)符0,1,2...但當(dāng)枚舉中的某個(gè)成員賦值后,其后的成員按依次加1的規(guī)則確定其值。enumeration二十.堆(HEAP)堆是ー種動(dòng)態(tài)存儲(chǔ)結(jié)構(gòu)(樹(shù),可擴(kuò)展性特別強(qiáng)),實(shí)際上就是數(shù)據(jù)段中的自由存儲(chǔ)區(qū),常用于動(dòng)態(tài)數(shù)據(jù)的存儲(chǔ)分配。它可以不斷進(jìn)行分配直到?jīng)]有堆空間為止,也可以隨時(shí)進(jìn)行釋放、再分配,不存在次序問(wèn)題。堆的作用域一般都是全局/靜態(tài)的。動(dòng)態(tài):是指在程序運(yùn)行期間確定其空間大小并且可以中途調(diào)整大小。內(nèi)存空間管理:分為代碼段(只讀的)、數(shù)據(jù)段(可讀寫(xiě))(靜態(tài)存儲(chǔ)區(qū))、BSS段(靜態(tài)〈有條件的全局〉/全局存儲(chǔ)區(qū))、堆(動(dòng)態(tài)全局〈必須人工釋放〉存儲(chǔ)區(qū))、自由空間(還未被分配)、棧、遠(yuǎn)堆、自由空間cat/proc/具體的pid/maps二H一.其它關(guān)鍵字.const被const修飾的變量是只讀的,就是在程序的運(yùn)行期間,其數(shù)值不能被改變。a.修飾變量初始化這樣的語(yǔ)句constintiVal=30;〃以后iVal就變成了一個(gè)常量(只讀變b.修飾函數(shù)形參voidfunc(constintiVal)〃保護(hù)形參值在操作過(guò)程中不會(huì)被改變。忠于使用者,更重要的是可避免很多的誤操作,就像if(i==0)要改寫(xiě)成(0==i)是同樣的道理。c.const在不同的位置有不同的含義constint*p=iVal;P++;//(*p)++;//const加在數(shù)據(jù)類(lèi)型左邊限制指針?biāo)赶虻淖兞恐蛔xint*constp2=iVal;//p2++; //const加在數(shù)據(jù)類(lèi)型?右邊限制指針變量自身為只讀2.volatile使用volatile修飾ー個(gè)變量就是告訴編譯器,這個(gè)變量可能會(huì)被未知的因素改變,編譯器對(duì)這個(gè)變量的訪問(wèn)代碼不應(yīng)該進(jìn)行優(yōu)化。volatile告訴編譯器應(yīng)該在這個(gè)變量被改變的時(shí)候,立刻把它寫(xiě)到內(nèi)存中,讀取這個(gè)變量的時(shí)候,不使用寄存器里面的備份數(shù)據(jù),而是直接從內(nèi)存的相應(yīng)地址將這個(gè)數(shù)據(jù)讀取出來(lái)。(優(yōu)化的副產(chǎn)品:寄存器和內(nèi)存的數(shù)據(jù)不ー定是同步的)num3—)使用:vl>多線(xiàn)程,多進(jìn)程應(yīng)用中的共享變量<2>硬件寄存器<3>在ー個(gè)中斷服務(wù)程序中會(huì)訪問(wèn)的非自動(dòng)變量二十二.文件操作基本常識(shí)文件:指存儲(chǔ)在媒體介質(zhì)上的數(shù)據(jù)集合。(傳統(tǒng)的文件概念)UNIX/LINUX一切偕文件.兩種文件輸入輸出系統(tǒng):a.由ANS!標(biāo)準(zhǔn)定義的緩沖文件(也稱(chēng)為標(biāo)準(zhǔn)文件流輸入輸出vI/O>系統(tǒng));socket控制臺(tái)的標(biāo)準(zhǔn)輸入輸出函數(shù):scanf()getchar()gets()vvfgets?!ǔ藄canf其他的會(huì)把回車(chē)符吸收。printf()putchar()puts()有關(guān)文件的參數(shù)(文件結(jié)構(gòu)指針或稱(chēng)流指針),只要用標(biāo)準(zhǔn)設(shè)備的流指針代替,這些標(biāo)準(zhǔn)文件的輸入輸出函數(shù)即成為控制臺(tái)I/O函數(shù)。設(shè)備文件流指針名FilelD
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 智慧物流解決方案合作框架協(xié)議
- 海南省部分學(xué)校2024-2025學(xué)年高三下學(xué)期學(xué)業(yè)水平診斷測(cè)試(三)地理試題(含答案)
- 法律行業(yè)法律咨詢(xún)免責(zé)聲明書(shū)
- 昆蟲(chóng)歷險(xiǎn)記觀后感
- 超前鋼管 現(xiàn)場(chǎng)質(zhì)量檢驗(yàn)報(bào)告單
- 智能酒店客房控制系統(tǒng)采購(gòu)合同
- 貨車(chē)駕駛員合同協(xié)議書(shū)
- 電子商務(wù)行業(yè)增長(zhǎng)趨勢(shì)分析表
- 林地土地承包合同
- 初中生校園欺凌預(yù)防故事征文
- 特殊作業(yè)安全管理監(jiān)護(hù)人專(zhuān)項(xiàng)培訓(xùn)課件
- 農(nóng)行競(jìng)聘高級(jí)專(zhuān)員述職報(bào)告范本
- 湖北省荊州市英語(yǔ)初一上學(xué)期期末試題與參考答案(2024年)
- 鶴壁海格龍升3萬(wàn)噸溴系列新材料產(chǎn)品環(huán)評(píng)資料環(huán)境影響
- 2024屆全國(guó)新高考英語(yǔ)復(fù)習(xí)-讀后續(xù)寫(xiě)微寫(xiě)作
- 顳下頜關(guān)節(jié)疾?。谇活M面外科學(xué)課件)
- 2025屆福建廈門(mén)雙十中學(xué)高一數(shù)學(xué)第一學(xué)期期末經(jīng)典模擬試題含解析
- 中考語(yǔ)文一輪專(zhuān)題復(fù)習(xí):詩(shī)歌鑒賞中常見(jiàn)的意象(共32張課件)
- 課件:《中華民族共同體概論》第一講 中華民族共同體基礎(chǔ)理論
- 高中《信息技術(shù)》必修1全冊(cè)知識(shí)點(diǎn)復(fù)習(xí)課件
- 2023年上半年教師資格證《高中數(shù)學(xué)》真題及答案
評(píng)論
0/150
提交評(píng)論