版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第一章指針&內(nèi)存和變量:內(nèi)存中的每個(gè)位置由一個(gè)獨(dú)一無(wú)二的地址標(biāo)識(shí),并且內(nèi)存中每個(gè)位置都包含一個(gè)值。高級(jí)語(yǔ)言所提供的特性之一就是通過(guò)名字而不是地址來(lái)訪問(wèn)內(nèi)存的位置。這些名字就是我們所稱的變量。也值和類型:不能簡(jiǎn)單地通過(guò)檢查一個(gè)值的位來(lái)判斷它的類型,值得類型并非值本身所固有的一種特性,而是取決于它的使用方式。&指針變量的內(nèi)容:指針的初始化是用心操作符完成的,它用于產(chǎn)生操作數(shù)的內(nèi)存地址。例如:為■例如:為■?與口匕鼻i.說(shuō)明:灰的值應(yīng)該是操作數(shù)公所在的地址。國(guó)間接訪問(wèn)操作符:通過(guò)一個(gè)指針訪問(wèn)它所指向的地址的過(guò)程稱為間接訪問(wèn)或解引用指針。例如:為■?Hearns;說(shuō)明:H4為操作數(shù)0所在地址中的值,H是用于執(zhí)行間接訪問(wèn)的單目操作符。國(guó)末初始化和非法的指針例如非法操作:為■?HS.;⑤Hsa匕圄說(shuō)明:究竟公指向哪里?我們聲明了這個(gè)變量,但從未對(duì)它進(jìn)行初始化,所以我們沒(méi)有辦法預(yù)測(cè)口目這個(gè)值將儲(chǔ)存于什么地方。也L六指針:標(biāo)準(zhǔn)定義了.六』旨針,它作為一個(gè)特殊的指針變量,表示不指向任何東西。從定義上看,L六指針并未指向任何東西。因此,對(duì)一個(gè)L六指針進(jìn)行解引用操作是非法的。在對(duì)指針進(jìn)行解引用操作之前,你首先必須確保它并非國(guó)守六六指針。也指針,間接訪問(wèn)和左值:指針變量可以作為左值,并不是因?yàn)樗鼈兪侵羔槪且驗(yàn)樗鼈兪亲兞?。間接訪問(wèn)指定了一個(gè)特定的內(nèi)存位置,這樣我們可以把間接訪問(wèn)表達(dá)式的結(jié)果作為使用。也指針,間接訪問(wèn)和變量例如:HfflGaia.說(shuō)明:首先,◎操作符產(chǎn)生變量公的地址,它是一個(gè)指針變量。接著,區(qū)操作符訪問(wèn)其操作數(shù)所表示的地址。所以公的值為都。也指針常量例如:H&ooaia.說(shuō)明:這條語(yǔ)句是非法的,因?yàn)樽置嬷悼谥诘念愋褪钦停g接訪問(wèn)操作只能作用于指針類型表達(dá)式。所以可以改成如下語(yǔ)句。
例如:w分為■?H&ooais說(shuō)明:這個(gè)技巧唯一有用之處是你偶爾通過(guò)地址訪問(wèn)內(nèi)存中某個(gè)特定的位置,它并不是用于訪問(wèn)某個(gè)變量,而是訪問(wèn)硬件本身。?指針的指針c例如:inta=12;int*b=&a;int**c=&b;說(shuō)明:變量b是一個(gè)指向整型的指針,所以c是指向指向整型的指針的指針。如上圖所示。表1雙重間接訪問(wèn)表達(dá)式相當(dāng)?shù)谋磉_(dá)式a12*bb&a*ba,12*c**c&bb,&a*b,a,12*c**c&bb,&a*b,a,12實(shí)例計(jì)算一個(gè)字符串的長(zhǎng)度#includesize_tstrlen(char*string{intlength=0;while(*string++!=’\0’length+=1;returnlength;}在一組字符串中查找#include#defineTURE1#defineFALSE0intfind_char(char**strings,charvalue{char*string;while((string=*strings++!=NULL{while((*string!=’\0’{if(*string++=valuereturnTURE;}}returnFALSE;}}?指針運(yùn)算:指針加上一個(gè)整數(shù)的結(jié)果是另一個(gè)指針。問(wèn)題是,它指向哪里?如果你將字符指針加1,運(yùn)算結(jié)果產(chǎn)生的指針指向內(nèi)存中的下一個(gè)字符。當(dāng)一個(gè)指針和一個(gè)整數(shù)量執(zhí)行算數(shù)運(yùn)算前始終會(huì)根據(jù)合適的大小進(jìn)行調(diào)整。這個(gè)“合適的大小”就是指針?biāo)赶蝾愋偷拇笮?。例?:例如:float占據(jù)4個(gè)字節(jié),在計(jì)算float型指針加3的表達(dá)式時(shí),這個(gè)3將根據(jù)float類型的大?。ù死袨?)進(jìn)行調(diào)整(相乘)。這樣,實(shí)際加到指針上的整型值為12。C的指針?biāo)銛?shù)運(yùn)算只限于兩種形式:1.指針■整數(shù):標(biāo)準(zhǔn)定義這種形式只能用于指向數(shù)組中某個(gè)元素指針。2.指針根指針:只有當(dāng)兩個(gè)指針都指向同一個(gè)數(shù)組中的元素時(shí),才允許從一個(gè)指針減去另一個(gè)指針。指針減法運(yùn)算的值是兩個(gè)指針在內(nèi)存中的距離(以數(shù)組元素的長(zhǎng)度為單位,而不是以字節(jié)為單位),因?yàn)闇p法運(yùn)算的結(jié)果將除以數(shù)組元素類型的長(zhǎng)度。C的關(guān)系運(yùn)算:用下列關(guān)系操作符對(duì)兩個(gè)指針值進(jìn)行比較是可能的:<,<=,>,>=不過(guò)前提是它們都指向同一個(gè)數(shù)組中的元素。例1:#defineN_VALUES5floatvalues[N_VALUES];float*vp;for(vp=&values[0];vp<values[N_VALUES];*vp++=0;說(shuō)明:這個(gè)測(cè)試是合法的,因?yàn)関p和指針常量都指向同一數(shù)組中的元素。for(vp=&values[N_VALUES];vp>&values[0];*--vp=0;說(shuō)明:數(shù)組元素將以相反的次序清除。我們讓vp指向數(shù)組最后那個(gè)元素后面的內(nèi)存位置,但在對(duì)它進(jìn)行間接訪問(wèn)之前先執(zhí)行自減操作。例3:for(vp=&values[N_VALUES-1];vp>=&values[0];vp--*vp=0;說(shuō)明:在數(shù)組第1個(gè)元素被清除之后,比較表達(dá)式vp>=&values[0]的值是未定義的,因?yàn)関p移到了數(shù)組的邊界之外。標(biāo)準(zhǔn)允許指向數(shù)組元素的指針與指向數(shù)組最后一個(gè)元素的后面的那個(gè)內(nèi)存位置的指針進(jìn)行比較,但不允許與指向數(shù)組第1個(gè)元素之前的那個(gè)內(nèi)存位置的指針進(jìn)行比較。第二章函數(shù)?函數(shù)定義:函數(shù)的定義就是函數(shù)體的實(shí)現(xiàn)。函數(shù)體就是一個(gè)代碼塊,它在函數(shù)被調(diào)用時(shí)執(zhí)行。函數(shù)定義的語(yǔ)法:類型函數(shù)名(形式參數(shù))代碼塊程序例子:在數(shù)組中尋找某個(gè)特定整型值的存儲(chǔ)位置,并返回一個(gè)指向該位置的指針#includeint*find_int(intkey,intarray[],intarray_len{inti;for(i=0;iif(array[i]==keyreturn&array[i];returnNULL;}?return語(yǔ)句:當(dāng)執(zhí)行流到達(dá)函數(shù)定義的末尾時(shí),函數(shù)就將返回(return)。return
語(yǔ)句允許你從函數(shù)體的任何位置返回,并不一定要在函數(shù)體的末尾。語(yǔ)法:returnexpression;沒(méi)有返回值的函數(shù)應(yīng)該把函數(shù)的類型聲明為void,expression就被省略。真函數(shù)是從表達(dá)式內(nèi)部調(diào)用的,它必須返回一個(gè)值,用于表達(dá)式的求值,這類函數(shù)的return語(yǔ)句必須包含一個(gè)表達(dá)式。通常,表達(dá)式的類型就是函數(shù)聲明的返回類型。在C中,子程序不論是否存在返回值,均被稱為函數(shù)。調(diào)用一個(gè)真函數(shù),但不在任何表達(dá)式中使用這個(gè)返回值是完全可能的。在這種情況下,返回值就被丟棄。但是,從表達(dá)式內(nèi)部調(diào)用一個(gè)過(guò)程類型的函數(shù)(無(wú)返回值)是一個(gè)嚴(yán)重的錯(cuò)誤,因?yàn)檫@樣一來(lái)在表達(dá)式的求值過(guò)程中會(huì)使用一個(gè)不可預(yù)測(cè)的值(垃圾)?!觥龊瘮?shù)聲明:函數(shù)聲明出現(xiàn)在函數(shù)被調(diào)用的地方,函數(shù)聲明向編譯器提供該函數(shù)的相關(guān)信息,用于確保函數(shù)被正確地調(diào)用。原型:有兩種向編譯器提供一些關(guān)于函數(shù)的特定信息的方。第一種方法,首先,如果同一源文件的前面已經(jīng)出現(xiàn)了該函數(shù)的定義,編譯器就會(huì)記住它的參數(shù)數(shù)量和類型,以及函數(shù)的返回值類型。接著,編譯器便可以檢查該函數(shù)的所以后續(xù)調(diào)用(在同一個(gè)源文件中),確保它們是正確地。第二種方法是使用函數(shù)原型。原型總結(jié)了函數(shù)定義的起始部分的聲明,向編譯器提供有關(guān)該函數(shù)應(yīng)該如何調(diào)用的完整信息。使用原型最方便(且最安全)的方法是把原型置于一個(gè)單獨(dú)的文件,當(dāng)其他源文件需要這個(gè)函數(shù)的原型時(shí),就使用指腔比~。指令包含該文件。函數(shù)的缺省認(rèn)認(rèn)定:當(dāng)程序調(diào)用一個(gè)無(wú)法見(jiàn)到原型的函數(shù)時(shí),編譯器便認(rèn)為該函數(shù)返回一個(gè)整型值。對(duì)于那些不返回整型值的函數(shù),這種認(rèn)定可能會(huì)引起錯(cuò)誤。所以,所有的函數(shù)都應(yīng)該具有原型,尤其是那些返回值不是整型的函數(shù)。例如:假設(shè)有一個(gè)函數(shù)xyz,它返回float值3.14。在SunSparc工作站中,用于表示這個(gè)浮點(diǎn)數(shù)的二進(jìn)制位模式如下:01000000010010001111010111000011現(xiàn)在假定函數(shù)是這樣被調(diào)用的:floatf;f=xyz(;說(shuō)明:如果在函數(shù)調(diào)用之前編譯器無(wú)法看到它的原型,它便認(rèn)定這個(gè)函數(shù)返回一個(gè)整型值,并產(chǎn)生指令將這個(gè)值轉(zhuǎn)換成float,然后再賦值給變量f。轉(zhuǎn)換指令把它們解釋為整型值1,078,523,331,并把這個(gè)值轉(zhuǎn)換為float類型,結(jié)果存儲(chǔ)于變量f中。總函數(shù)的參數(shù):C的規(guī)則很簡(jiǎn)單:所有參數(shù)都是傳值調(diào)用。但是如果被傳遞的參數(shù)是一個(gè)數(shù)組名,并且在函數(shù)中使用下標(biāo)引用該數(shù)組的參數(shù),那么在函數(shù)中對(duì)數(shù)組元素進(jìn)行修改實(shí)際上修改的是調(diào)用程序中的數(shù)組元素。函數(shù)將訪問(wèn)調(diào)用程序的數(shù)組元素,數(shù)組并不會(huì)被復(fù)制。這個(gè)行為被稱為“傳址調(diào)用”。數(shù)組參數(shù)的行為似乎與傳值調(diào)用規(guī)則相悖。但是,其實(shí)并無(wú)矛盾,數(shù)組名的值實(shí)際上是一個(gè)指針,傳遞給函數(shù)的就是這個(gè)指針的一份拷貝。下標(biāo)引用實(shí)際上是間接訪問(wèn)的另一種形式它可以對(duì)指針執(zhí)行間接訪問(wèn)操作,訪問(wèn)指針指向的內(nèi)存位置。參數(shù)(指針)實(shí)際上是一份拷貝,但在這份拷貝上執(zhí)行間接訪問(wèn)操作所訪問(wèn)的是原先的數(shù)組。國(guó)ADT和黑盒:C可以用于設(shè)計(jì)和實(shí)現(xiàn)抽象數(shù)據(jù)類型(ADT,abstractdatatype),因?yàn)樗梢韵拗坪瘮?shù)和數(shù)據(jù)定義的作用域。這個(gè)技巧也被稱為黑盒設(shè)計(jì)。抽象數(shù)據(jù)類型的基本想法是很簡(jiǎn)單的—模塊具有功能說(shuō)明和接口說(shuō)明,前者說(shuō)明模塊所執(zhí)行的任務(wù),后者定義模塊的使用。但是模塊的用戶并不需要知道模塊實(shí)現(xiàn)的任何細(xì)節(jié),而且除了那些定義好的接口之外,用戶不能以任何方式訪問(wèn)模塊。限制對(duì)模塊的訪問(wèn)時(shí)通過(guò)static關(guān)鍵字的合理使用實(shí)現(xiàn)的,它可以限制對(duì)那些并非接口的函數(shù)和數(shù)據(jù)的訪問(wèn)。也遞歸也可變參數(shù)列表第三章數(shù)組國(guó)一維數(shù)組數(shù)組名inta;intb[10];我們把變量a稱為標(biāo)量,因?yàn)樗且粋€(gè)單一的值,這個(gè)變量的類型是一個(gè)整數(shù)。我們把變量b稱為數(shù)組,因?yàn)樗且恍┲档募?。下?biāo)和數(shù)組名一起使用,用于標(biāo)識(shí)該集合中某個(gè)特定的值。b[4]的類型是整型,但b的類型呢?在C中,幾乎所有使用數(shù)組名的表達(dá)式中,數(shù)組名的值是一個(gè)指針常量,也就是數(shù)組第一個(gè)元素的地址。它的類型取決于數(shù)組元素的類型:如果它們是int類型,那么數(shù)組名的類型就是指向int的常量指針。只有當(dāng)數(shù)組名在表達(dá)式中使用時(shí),編譯器才會(huì)為它產(chǎn)生一個(gè)指針常量。注意這個(gè)值是指針常量而不是指針變量,你不可以修改常量的值。只有在兩種場(chǎng)合下,數(shù)組名并不用指針常量來(lái)表示就是當(dāng)數(shù)組名作為sizeof操作符或單目操作符&的操作數(shù)時(shí)。sizeof返回整個(gè)數(shù)組的長(zhǎng)度而不是指向數(shù)組的指針的長(zhǎng)度。取一個(gè)數(shù)組名的地址所產(chǎn)生的是一個(gè)指向數(shù)組的指針,而不是一個(gè)指向某個(gè)指針常量值的指針。例如:inta[10];intb[10];int*c;c=&a[0];說(shuō)明:表達(dá)式&a[0]是一個(gè)指向數(shù)組第一個(gè)元素的指針。但那時(shí)數(shù)組名本身的值,所以下面這條賦值語(yǔ)句和上面那條賦值語(yǔ)句所執(zhí)行的任務(wù)是一樣的:c=a。另外記住,在這里a是常量,不可修改,所以a=c是非法的。下標(biāo)引用
例如:*(b+3說(shuō)明:首先,b的值是一個(gè)指向整型的指針,所以3這個(gè)值根據(jù)整型值的長(zhǎng)度進(jìn)行調(diào)整。加法運(yùn)算的結(jié)果是另一個(gè)指向整型的指針,它所指向的是數(shù)組的第1個(gè)元素向后移3個(gè)整型長(zhǎng)度的位置。然后,間接訪問(wèn)操作這個(gè)新位置,或者取得那里的值(右值),或者把一個(gè)新值存儲(chǔ)于該處(左值)。它和下標(biāo)引用的執(zhí)行過(guò)程完全相同,除了優(yōu)先級(jí)之外,下標(biāo)引用和間接訪問(wèn)完全相同。例1:array[subscript]*(array+(subscript上述兩個(gè)表達(dá)式是相同的。例2:intarray[10];int*ap二array+2;說(shuō)明:在進(jìn)行指針加法運(yùn)算時(shí)會(huì)對(duì)2進(jìn)行調(diào)整。運(yùn)算結(jié)果所產(chǎn)生的指針ap指向array[2]。根據(jù)上面的程序,寫(xiě)出關(guān)于涉及ap的表達(dá)式所對(duì)應(yīng)的關(guān)于array的對(duì)等式。關(guān)于??诳?。內(nèi)的對(duì)等式等式0口0口M備合□日窗口可否□□公0口M備合□日窗口可否□□公0口9口出K9曾出自公。口口。內(nèi)9曾出國(guó)區(qū)□HI0口M備合口日備I可合口口。內(nèi)9I竭9吒出HIHI或◎令□□公內(nèi)91HIHI或◎令□□公內(nèi)91出M備合□□合內(nèi)?□HI91出◎合合法但無(wú)□法預(yù)測(cè)令口位置令□□否內(nèi)合口9口口期但是非93出法9①曰期。內(nèi)9口出另外:2[array]=*(2+(array=*(array+2,2[array]這個(gè)詭異技巧之所以可行,是緣于C實(shí)現(xiàn)下標(biāo)的方法。指針與下標(biāo)如果你可以互換的使用指針表達(dá)式和下標(biāo)表達(dá)式,那么你應(yīng)該使用哪一個(gè)?下標(biāo)更容易理解,尤其是在多維數(shù)組中。但是下標(biāo)絕不會(huì)比指針更有效率,但指針有時(shí)候會(huì)比下標(biāo)更有效率。例1:intarray[10],a;for(a=0;a<10;a+=1array[a]=0;例2:intarray[10],*ap;for(ap=array;a*ap=0;說(shuō)明:上面兩個(gè)程序都執(zhí)行了將array數(shù)組清零的任務(wù)。例1中,為了對(duì)下標(biāo)表達(dá)式求值,編譯器在程序中插入指令,取a的值,并把它與整型的長(zhǎng)度4相乘。這個(gè)乘法需要花費(fèi)一定的時(shí)間和空間。例2中,循環(huán)每次執(zhí)行時(shí),執(zhí)行乘法運(yùn)算的數(shù)都是兩個(gè)相同的數(shù)(1和4)。結(jié)果,這個(gè)乘法只在編譯時(shí)執(zhí)行一次——程序現(xiàn)在包含了一條指令,把4與指針相加。程序運(yùn)行時(shí)并不執(zhí)行乘法運(yùn)算。這個(gè)例子說(shuō)明了指針比下標(biāo)更有效率的場(chǎng)合——當(dāng)你在數(shù)組中1次1步地移動(dòng)時(shí),與固定數(shù)字相乘的運(yùn)算在編譯時(shí)完成,所以運(yùn)行時(shí)所需的指令就少一些。例3:a=get_value(;array[a]=0;例4:a=get_value(;*(array+a=0;說(shuō)明:上面兩個(gè)例子所產(chǎn)生的代碼并無(wú)區(qū)別。a可能是任何值,在運(yùn)行時(shí)方知。所以兩種方案都需要乘法指令,用于對(duì)a的值進(jìn)行調(diào)整。這個(gè)例子說(shuō)明了指針和下標(biāo)的效率完全相同的場(chǎng)合。指針的效率口封當(dāng)你根據(jù)某個(gè)固定數(shù)目的增量在一個(gè)數(shù)組中移動(dòng)時(shí),使用指針變量將比使用下標(biāo)產(chǎn)生效率更高的代碼。當(dāng)這個(gè)增量是1并且機(jī)器具有地址自動(dòng)增量模式時(shí),這點(diǎn)表現(xiàn)得更為突出。曾建聲明為寄存器變量的指針通常比位于靜態(tài)內(nèi)存和堆棧中的指針效率更高。冒過(guò)如果你可以通過(guò)測(cè)試一些已經(jīng)初始化并經(jīng)過(guò)調(diào)整的內(nèi)容來(lái)判斷循環(huán)是否應(yīng)該終止,那么你就不需要使用一個(gè)單獨(dú)的計(jì)數(shù)器。解建那些必須在運(yùn)行時(shí)求值的表達(dá)式較之如&array[SIZE]或array+SIZE這樣的常量表達(dá)式往往代價(jià)更高。數(shù)組和指針例如:inta[5];int*b;說(shuō)明:聲明一個(gè)數(shù)組時(shí),編譯器將根據(jù)聲明所指定的元素?cái)?shù)量為數(shù)組保留內(nèi)存空間,然后再創(chuàng)建數(shù)組名,它的值是一個(gè)常量,指向這段空間的起始位置。聲明一個(gè)指針變量時(shí),編譯器只為指針本身保留內(nèi)存空間,如果它是一個(gè)自動(dòng)變量,它甚至根本不會(huì)被初始化。因此,上述聲明之后,表達(dá)式*2是完全合法的,但表達(dá)式*b卻是非法的。*b將訪問(wèn)內(nèi)存中某個(gè)不確定的位置,或者導(dǎo)致程序終止。另一方面b++可以通過(guò)編譯,但a++不可以,因?yàn)閍的值是常量。
作為函數(shù)參數(shù)的數(shù)組名例如:voidstrcpy(char*buffer,charconst*string{while((*buffer++=*string++!=’\0’;}說(shuō)明:while語(yǔ)句中的*5出口8++表達(dá)式,它取得string所指向的那個(gè)字符,并且產(chǎn)生一個(gè)副作用,就是修改string,使它指向下一個(gè)字符。用這種方式修改形參并不會(huì)影響調(diào)用程序的實(shí)參,因?yàn)橹挥袀鬟f給函數(shù)的那份拷貝進(jìn)行了修改。另外關(guān)于這個(gè)函數(shù),還有兩個(gè)要點(diǎn)值得一提。首先,形參被聲明為一個(gè)指向const字符的指針。對(duì)于一個(gè)并不打算修改這些字符的函數(shù)而言,預(yù)先把它聲明為常量,第一,這是一個(gè)良好的文檔習(xí)慣,第二,編譯器可以捕捉到任何試圖修改該數(shù)據(jù)的意外錯(cuò)誤,第三,這類聲明允許向函數(shù)傳遞const參數(shù)。聲明數(shù)組參數(shù)例如:intstrlen(char*string;例如:intstrlen(char*string;intstrlen(charstring[];說(shuō)明:調(diào)用函數(shù)時(shí)實(shí)際傳遞的是一個(gè)指針,所以函數(shù)的形參實(shí)際上是一個(gè)指針。上面兩個(gè)函數(shù)原型是相等的。但是第一個(gè)指針形式更加準(zhǔn)確,因?yàn)閷?shí)參實(shí)際實(shí)際上是個(gè)指針,而不是數(shù)組。函數(shù)原型中的一維數(shù)組形參無(wú)需寫(xiě)明它的元素?cái)?shù)目,因?yàn)楹瘮?shù)并不為數(shù)組參數(shù)分配內(nèi)存空間。形參只是一個(gè)指針,它指向的是已經(jīng)在其他地方分配好內(nèi)存的空間。初始化1.靜態(tài)初始化:數(shù)組初始化的方式類似于標(biāo)量變量的初始化方式上上也就是取決于它們的存儲(chǔ)類型。存儲(chǔ)于靜態(tài)內(nèi)存的數(shù)組只初始化一次,也就是在程序開(kāi)始執(zhí)行之前。程序并不需要執(zhí)行指令把這些值放到合適的位置,它們一開(kāi)始就在那里了。如果數(shù)組未被初始化,數(shù)組元素的初始值將會(huì)自動(dòng)設(shè)置為零。當(dāng)這個(gè)文件載入到內(nèi)存中準(zhǔn)備執(zhí)行時(shí),初始化后的數(shù)組值和程序指令一樣也被載入到內(nèi)存中。因此當(dāng)程序執(zhí)行時(shí),靜態(tài)數(shù)組已經(jīng)初始化完畢。2.自動(dòng)初始化:因?yàn)樽詣?dòng)變量位于運(yùn)行時(shí)堆棧中,執(zhí)行流每次進(jìn)入它們所在的代碼塊時(shí),這類變量每次所處的內(nèi)存位置可能并不相同。在程序開(kāi)始之前,編譯器沒(méi)有辦法對(duì)這些位置進(jìn)行初始化。所以,自動(dòng)變量在缺省情況下是未初始化的。如果自動(dòng)變量的聲明中給出了初始值,每次當(dāng)執(zhí)行流進(jìn)入自動(dòng)變量聲明所在的作用域時(shí),變量就被一條隱式的賦值語(yǔ)句初始化。這條隱式的賦值語(yǔ)句和普通的賦值語(yǔ)句一樣需要時(shí)間和空間來(lái)執(zhí)行。數(shù)組的問(wèn)題在于初始化列表中可能有很多值,這就可能產(chǎn)生許多條賦值語(yǔ)句。對(duì)于那些非常龐大的數(shù)組,可能它的初始化時(shí)間可能非??捎^。因此,這里就需要權(quán)衡利弊。當(dāng)數(shù)組的初始化局部與一個(gè)函數(shù)(或代碼塊)時(shí),在程序的執(zhí)行流每次進(jìn)入該函數(shù)(或代碼塊)時(shí),每次都對(duì)數(shù)組進(jìn)行重新初始化是不是值得。如果答案是否定的,你就把數(shù)組聲明為static,這樣數(shù)組的初始化只需在程序開(kāi)始前執(zhí)行一次。不完整的初始化例如:intvector[5]={1,2,3,4,5,6};intvector[5]={1,2,3,4};說(shuō)明:在這兩種情況下,初始化值的數(shù)目和數(shù)組元素的數(shù)目并不匹配。第1個(gè)聲明是錯(cuò)誤的,我們沒(méi)有辦法把6個(gè)整型值裝到5個(gè)整型變量中。但是,第2個(gè)聲明是合法的,它為數(shù)組前4個(gè)元素提供了初始值,最后一個(gè)元素則初始化為0。自動(dòng)計(jì)算數(shù)組長(zhǎng)度例如intvector[]={1,2,3,4,5};說(shuō)明:如果聲明中并未給出數(shù)組的長(zhǎng)度,編譯器就把數(shù)組的長(zhǎng)度設(shè)置為剛好能夠容納所有的初始值的長(zhǎng)度。如果初始值列表經(jīng)常修改,這個(gè)技巧尤其重要。字符數(shù)組的初始化例如:caressae[]={,e,,,o,0};charmessage[]=”hello”;說(shuō)明:第二條程序,盡管看上去它像是一個(gè)字符串常量,實(shí)際上并不是。它是前例的初始化列表的另一種寫(xiě)法。當(dāng)用于初始化一個(gè)字符數(shù)組時(shí),它就是一個(gè)初始化列表。在其他任何地方,它都表示一個(gè)字符串常量。例如:caressae1[]=eo;char*messa說(shuō)明:前者初始化一個(gè)字符數(shù)組的元素,而后者則是一個(gè)真正的字符串常量。這個(gè)指針變量被初始化為指向這個(gè)字符串常量的存儲(chǔ)位置?!觥龆嗑S數(shù)組例如:inta;intb[10];intc[6][10];intd[3][6][10];說(shuō)明:a是個(gè)簡(jiǎn)單整數(shù);b是個(gè)向量,包含10和整數(shù);c只是在b的基礎(chǔ)上再加一維,可以把c看作是一個(gè)包含6個(gè)元素的向量,只不過(guò)它的每個(gè)元素本身是一個(gè)包含10個(gè)整形元素的向量,即c是一個(gè)一維數(shù)組的一維數(shù)組;d本身是一個(gè)包含3個(gè)元素的數(shù)組,每個(gè)元素都是包含6個(gè)元素的數(shù)組,而這6個(gè)元素中的每一個(gè)又都是包含10個(gè)整型元素的數(shù)組。簡(jiǎn)潔的說(shuō),d是一個(gè)3排6行10列的整型三維數(shù)組。存儲(chǔ)順序:在C中,多維數(shù)組的元素存儲(chǔ)順序按照最右邊的下標(biāo)率先變化的原則,稱為行主序。數(shù)組名:一維數(shù)組名的值是一個(gè)指針常量,它的類型是“指向元素類型的指針”,它指向數(shù)組的第一個(gè)元素。而多維數(shù)組的第1維的元素實(shí)際上是一個(gè)數(shù)組。例如:intmatrix[3][10];說(shuō)明:上面的聲明創(chuàng)建了matrix,它可以看作是一個(gè)一維數(shù)組,包含3個(gè)元素,只是每個(gè)元素恰好是包含10個(gè)整型元素的數(shù)組。matrix這個(gè)名字的值是一個(gè)指向它第一個(gè)元素的指針,所以matrix是一個(gè)指向一個(gè)包含10個(gè)整型元素?cái)?shù)組的指針。下標(biāo):matrix例如:intmatrix[3][10];matrix[1][5]matrixmatrix+1說(shuō)明:如上圖所示matrix的類型是指向包含10個(gè)整型元素的數(shù)組的指針,它指向包含10個(gè)整型元素的第1個(gè)子數(shù)組。matrix+1也是一個(gè)指向包含10個(gè)整型元素的數(shù)組的指針,但它指向matr
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年山東單招第二志愿補(bǔ)錄考試模擬試卷含答案高分沖刺版
- 2026年甘肅單招醫(yī)衛(wèi)大類文化素質(zhì)技能綜合模擬卷含答案
- 2026年江西單招醫(yī)藥衛(wèi)生類省卷模擬卷含答案文化技能
- 2026年山東單招動(dòng)物醫(yī)學(xué)專業(yè)基礎(chǔ)題必刷含答案
- 2026年廣西單招學(xué)前教育類職業(yè)適應(yīng)性測(cè)試題庫(kù)含答案含職業(yè)認(rèn)知題
- 2026年廣東全國(guó)單招社會(huì)考生專用文化補(bǔ)基礎(chǔ)試卷含答案
- 物業(yè)設(shè)備巡檢課件
- 2026年青島單招電子信息大類中職生專業(yè)技能高頻題含答案
- 2026年安徽單招職業(yè)適應(yīng)性測(cè)試時(shí)事政治職業(yè)認(rèn)知模擬題含答案
- 2026年江西單招醫(yī)衛(wèi)大類考前密卷含答案預(yù)測(cè)率80
- 2025年齊齊哈爾市總工會(huì)工會(huì)社會(huì)工作者招聘39人考試筆試模擬試題及答案解析
- 中北大學(xué)2025年招聘編制外參編管理人員備考題庫(kù)(一)及一套完整答案詳解
- 教育學(xué)課件教學(xué)課件
- 學(xué)堂在線 雨課堂 學(xué)堂云 科研倫理與學(xué)術(shù)規(guī)范 章節(jié)測(cè)試答案
- 口腔診所運(yùn)營(yíng)管理手冊(cè)及營(yíng)銷(xiāo)方案設(shè)計(jì)
- 教輔銷(xiāo)售年終總結(jié)
- DRBFM的展開(kāi)詳細(xì)解讀2
- 四環(huán)素的發(fā)酵工藝課件
- 泥漿護(hù)壁鉆孔灌注樁的施工
- 征信調(diào)研報(bào)告3篇
- GB/T 20969.2-2021特殊環(huán)境條件高原機(jī)械第2部分:高原對(duì)工程機(jī)械的要求
評(píng)論
0/150
提交評(píng)論