2011年計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言常見(jiàn)問(wèn)題匯總_第1頁(yè)
2011年計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言常見(jiàn)問(wèn)題匯總_第2頁(yè)
2011年計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言常見(jiàn)問(wèn)題匯總_第3頁(yè)
2011年計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言常見(jiàn)問(wèn)題匯總_第4頁(yè)
已閱讀5頁(yè),還剩127頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

2011年計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言常見(jiàn)問(wèn)題匯總第1章聲明和初始化問(wèn)題:我如何決定使用那種整數(shù)類型?64位機(jī)上的64位類型是什么樣的?怎樣定義和聲明全局變量和函數(shù)最好?extern在函數(shù)聲明中是什么意思?關(guān)鍵字auto到底有什么用途?我似乎不能成功定義ー個(gè)鏈表。我試過(guò)typedefstruct{char*item;NODEPTRnext;}*NODEPTR;但是編譯器報(bào)了錯(cuò)誤信息。難道在C語(yǔ)言中一個(gè)結(jié)構(gòu)不能包含指向自己的指針嗎?怎樣建立和理解非常復(fù)雜的聲明?例如定義ー個(gè)包含N個(gè)指向返回指向字符的指針的函數(shù)的指針的數(shù)組?函數(shù)只定義了一次,調(diào)用了一次,但編譯器提示非法重定義了。main()的正確定義是什么?voidmain()正確嗎?對(duì)于沒(méi)有初始化的變量的初始值可以作怎樣的假定?如果一個(gè)全局變量初始值為“零”,它可否作為空指針或浮點(diǎn)零?代碼intf(){chara[]="Hello,world!";)不能編譯。這樣的初始化有什么問(wèn)題?char*p=malloc(10);編譯器提示“非法初始式‘‘云云。以下的初始化有什么區(qū)別?chara[]="stringliteral";char*p="stringliteral";當(dāng)我向p[i]賦值的時(shí)候,我的程序崩潰了。我總算弄清除函數(shù)指針的聲明方法了,但怎樣才能初始化呢?聲明和初始化我如何決定使用那種整數(shù)類型?如果需要大數(shù)值(大于32.767或小于ー32,767),使用!ong型.否則,如果空間很車要(如有大數(shù)組或很多結(jié)構(gòu)),使用short型。除此之外,就使用int型?如果嚴(yán)格定義的溢出特征很車要而負(fù)值無(wú)關(guān)緊要,或者你希望在操作二進(jìn)制位和字節(jié)時(shí)避免符號(hào)擴(kuò)展的問(wèn)題,請(qǐng)使用對(duì)應(yīng)的無(wú)符號(hào)類型。但是,要注意在表達(dá)式中混用有符號(hào)和無(wú)符號(hào)值的情況.盡管字符類型(尤其是無(wú)符號(hào)字符里)可以當(dāng)成“小”整型使用,但由于不可預(yù)知的符號(hào)擴(kuò)展和代碼增大有時(shí)這樣做可能得不償失.使用無(wú)符號(hào)字符型有所幫助;類似的問(wèn)題參見(jiàn)問(wèn)題12.1.在選擇浮點(diǎn)里和雙精度浮點(diǎn)型時(shí)也有類似的權(quán)衡。但如果一?個(gè)變量的指針必須為特定的類型時(shí),以上規(guī)則不再適用.如果因?yàn)槟撤N原因你需要聲明?個(gè)有嚴(yán)格大小的變量,確保象。99的<int-types.h>那樣用某種適當(dāng)?shù)膖ypedef封裝這種選擇。通常,這樣做唯一的好原因是試圖符合某種外部強(qiáng)加的存儲(chǔ)方案,請(qǐng)參見(jiàn)問(wèn)鹿20.30如果你需要操作超過(guò)C的內(nèi)置類型支持的超大變量,請(qǐng)參見(jiàn)問(wèn)題18.17.參考資料:[K&R1,Sec.2.2p.34];[K&R2,Sec.2.2p.36,Sec.A4.2pp.195-6,Sec.BUp.257];[ISO,Sec..1,Sec.];[H&S,Secs.5.1,5.2pp.110-114].64位機(jī)上的64位類型是什么樣的?C99標(biāo)準(zhǔn)定義了!onglong類型,其長(zhǎng)度可以保證至少64位,這種類型在某些編譯器上實(shí)現(xiàn)已經(jīng)頗有時(shí)日了.其它的編譯器則實(shí)現(xiàn)了類似」onglong的擴(kuò)展。另ー方面,也可以實(shí)現(xiàn)16位的短整型、32位的整型和64位的長(zhǎng)整里,有些編譯器正是這樣做的。參見(jiàn)問(wèn)題!8.17.參考資料:[C9X,Sec..1,Sec.]怎樣定義和聲明全局變量和函數(shù)最好?首先,盡管ー個(gè)全局變量或函數(shù)可以(在多個(gè)編譯單元中)有多處“聲明”,但是“定義”卻只能允許出現(xiàn)ー次.定義是分配空間并賦初值(如果有)的聲明.最好的安挿工在某個(gè)相關(guān)的.c文件中定義,然后在、, ,h)中進(jìn)行外部聲明,在需要使用的時(shí)候,只要包含對(duì)應(yīng)的頭文件即可。定義變量的.c文件也應(yīng)該包含該頭文件,以便編譯器檢査定義和聲明的一-致性.這條規(guī)則提供了高度的可移植性:它和ANSIC標(biāo)準(zhǔn)?致,同時(shí)也兼容大多數(shù)ANSI前的編譯器和連接器?Unix編譯器和連接器通常使用“通用模式”允許多重定義,只要保證最多對(duì)ー?處進(jìn)行初始化就可以了;ANSIC標(biāo)準(zhǔn)稱這種行為為“公共擴(kuò)展”,沒(méi)有語(yǔ)帶雙關(guān)的意思.可以使用預(yù)處理技巧來(lái)使類似DEFINEdnt,i);的語(yǔ)句在ー個(gè)頭文件中只出現(xiàn)一次,然后根據(jù)某個(gè)宏的設(shè)定在需要的時(shí)候轉(zhuǎn)化成定義或聲明。但不清楚這樣的麻煩是否值得.如果希望讓編譯器檢査聲明的一致性,一定要把全局聲明放到頭文件中.特別足,永遠(yuǎn)不要把外部函數(shù)的原型放到.c文件中:通常它與定義的一致性不能得到檢査,而矛盾的原型比不用還糟糕.蓼見(jiàn)問(wèn)題!0.4和18.6.參芍資料:[K&R1,Sec.4.5pp.76-7];[K&R2,Sec.4.4pp.80-1];[ISO,Sec.,Sec.6.7,Sec.6.7.2,Sec.G.5.11];[Rationale,Sec.];[H&S,Sec,4.8pp.101-104,Sec.9.2.3p.267];[CT&P,Sec.4.2pp.54-56].extem在函數(shù)聲明中是什么意思?它可以用作?種格式上的提示表明函數(shù)的定義可能在另一個(gè)源文件中,但在externint!〇J和mtf〇;之間并沒(méi)有實(shí)質(zhì)的區(qū)別.參考資料:[ISO,Sec.,Sec.6.5.1];[Rationale,Sec.];[H&S,Secs.4.3,4.3.1pp.75-6].關(guān)鍵字auto到底有什么用途?亳無(wú)用途:它已經(jīng)過(guò)時(shí)。參見(jiàn)問(wèn)題20.32.參考資料:[K&R1,Sec.A8.1p.193];[ISO,Sec.,Sec.6.5.1;];[H&S,Sec.4.3p,75,Sec.4.3.1p.76].1.G我似乎不能成功定義ー個(gè)鏈表〇我試過(guò)typedefstruct{char?item:NODEPTRnext:}*NODEPTR:但是編譯器報(bào)了錯(cuò)誤信息。難道在。語(yǔ)言中一個(gè)結(jié)構(gòu)不能包含指向自己的指針嗎?C語(yǔ)臺(tái)中的結(jié)構(gòu)當(dāng)然可以包含指向自己的指針;[K&R2,第6.5節(jié)]的討論和例子表明了這點(diǎn)。NODEPTR例子的問(wèn)題是在聲明next域的時(shí)候typedef還沒(méi)有定義.為了解決這個(gè)問(wèn)題,首先賦ア這個(gè)結(jié)構(gòu)ー個(gè)標(biāo)簽('structnode”)?然后,聲明“next”域?yàn)?structnode*M,或者分開(kāi)typedef定義和結(jié)構(gòu)定義,或者兩齊都采納.以ド是ー個(gè)修改后的版本:structnode{charstructnode*next;};typedefstructnode?NODEPTR;至少還有三種同樣正確的方法解決這個(gè)問(wèn)題.在用typedef定義互相引用的兩個(gè)結(jié)構(gòu)時(shí)也會(huì)產(chǎn)生類似的問(wèn)題.可以用同樣的方法解決.參見(jiàn)問(wèn)題2.1.參考資料:[K&R1,Sec.6.5p.101];[K&R2、Sec.6.5p.139];[ISO.Sec.6.5.2,Sec.J;[H&S,Sec.5.6.1pp.132-3]?1.?怎樣建立和理解非常復(fù)雜的聲明?例如定義ー個(gè)包含N個(gè)指向返回指向字符的指針的函數(shù)的指針的數(shù)組?這個(gè)冋意至少有以ド3種答案:1.char*(*(*a[N])())();2.3.用typedef逐步完成聲明:typedefchar*pc; /?字符指針 ?/typedefpcfpc(); /?返回字符指針的函數(shù)?/typedeffpc*pfpc; /*上面函數(shù)的指針 ?/typedefpfpcfpfpcO; /?返冋函數(shù)指針的函數(shù)?/typedeffpfpc*pfpfpc;/?上面函數(shù)的指針 ?/pfpfpca[N]; /?上面指針的數(shù)組 ?/使用cdecl程序,它可以把英文翻譯成C或?!把C翻譯成英文:cdecl>declareaasarrayofpointertofunctionreturningpointertofunctionreturningpointertocharchar?(?(?a[])())()通過(guò)類型轉(zhuǎn)換,cdecl也可以用ア解杼復(fù)雜的聲明,指出參數(shù)應(yīng)該進(jìn)入哪?對(duì)括號(hào)(如同在上述的復(fù)雜函數(shù)定義中)?參見(jiàn)同期18.1.

一木好的C語(yǔ)自書(shū)都會(huì)解釋如何“從內(nèi)到外”解杼和理解這樣復(fù)雜的C語(yǔ)さ聲明(“模擬聲明使用”).匕文的例子中的函數(shù)指針聲明還沒(méi)有包括蓼數(shù)類型信息.如果參數(shù)行復(fù)雜類型,聲明就會(huì)變得貞正的混亂了.現(xiàn)代的cdecl版本可以提供幫助.參考資料:[K&R2.Sec.5.12p.122];[ISO,Sec.6.5ff(esp.Sec.6.5.4)];[H&S,Sec.4.5pp.85-92,Sec.5.10.1pp.149-50].函數(shù)只定義了一次,調(diào)用了一次.但編譯器提示非法重定義了。在范國(guó)內(nèi)沒(méi)有聲明就調(diào)用(可能是第次調(diào)用在函數(shù)的定義之前)的函數(shù)被認(rèn)為返回整型(im)(且沒(méi)有任何零數(shù)類型信息),如果函數(shù)在后邊聲明或定義成其它類型就會(huì)林救矛盾.所有函數(shù)(非整型函數(shù)?定要)必須在調(diào)用之前聲明.另ー個(gè)可能的原因是該函數(shù)與某個(gè)頭文件中聲明的另ー個(gè)函數(shù)同名..?參見(jiàn)問(wèn)題!1.4和15.1參考資料:[K&Rl,Sec,4.2p.70];[KfcR2.Sec.4.2p.72];[ISO,Sec.];[H&S,Sec.4.7p.101].niain()的正確定義是什么?voidinain()正確嗎?參見(jiàn)問(wèn)題!1.11到11.16.(這樣的定義不正確).對(duì)于沒(méi)有初始化的變?的初始值可以作怎樣的假定?如果一個(gè)全局變量初始值為??零”,它可否作為空指針或浮點(diǎn)零?艮有“靜態(tài)。4.存期的未初始化變員(即,在函數(shù)外聲明的變顯和有靜態(tài)存儲(chǔ)類型的變量)可以確保初始値了孝,就像程序員健入了“=0”ー樣.因此,這些變成如果是指針會(huì)被初始化為正確的空指針,如果圧浮點(diǎn)數(shù)會(huì)被初始化為0.0(或正確的類型,參見(jiàn)第5章).具有“自動(dòng)”生存期的變魚(yú)(即,沒(méi)有靜態(tài)存儲(chǔ)類型的局部變量)如果沒(méi)有顯示地初始化,則包含的是垃圾內(nèi)容.對(duì)垃圾內(nèi)容不能作任何有用的假設(shè)。這些規(guī)則也適用「數(shù)組和結(jié)構(gòu)(稱為“聚合體”);對(duì)ナ初始化來(lái)說(shuō),數(shù)組和結(jié)構(gòu)都被認(rèn)為是“變員エ用m&Uoc()reiUoc()動(dòng)態(tài)分配的內(nèi)存也可能包含坨圾數(shù)據(jù),因此必須由凋用齊正確地初始化.用calloc。獲得的內(nèi)存為全零,但這對(duì)指針和浮點(diǎn)值不一定有用(參電問(wèn)題7.26和第5章).參考資料:[K&R1,Sec.4.9pp.82-4];[K&R2,Sec.4.9pp.85-86];卩SO,Sec.6.5.7,Sec.,Sec.];[H&S,Sec.4.2.8pp.72-3,Sec.4.6pp.92-3,Sec.4.6.2pp.94-5,Sec.4.6.3p.96.Sec.16.1p.386.]。

代碼intf(){chara[]="Hello,workl!":}不能編譯〇可能你使用的是ANSI之前的編譯器,還不支持“自動(dòng)聚集<'(automaticaggrogates,即讓靜態(tài)局部數(shù)組、結(jié)構(gòu)和聯(lián)合)的初始化。參見(jiàn)問(wèn)睡11.28.這樣的初始化有什么問(wèn)題?char*p=inalloc(lO);騙譯器提示?,非法初始式”云云。這個(gè)聲明是靜態(tài)或非局部變員嗎?函數(shù)調(diào)用只能出現(xiàn)在自動(dòng)變成(即局部非靜態(tài)變艮)的初始式中。以下的初始化有什么區(qū)別?chara[]="stringliteral":char*p="stringliteral":當(dāng)我向p[i]賦值的時(shí)候.我的程序崩潰了。川’,「ア‘廠喟仃區(qū)別的用法.用作數(shù)組初始值(如同在char&〇的聲明中),它指明該數(shù)組中字符的初始值。其它情況ド,它會(huì)轉(zhuǎn)化為?個(gè)無(wú)名的靜態(tài)字符數(shù)組,可能會(huì)存儲(chǔ)在只讀內(nèi)存中,這就是造成它不,定能被修改。在表達(dá)式環(huán)境中,數(shù)組通常被立即轉(zhuǎn)化為ー個(gè)指針(參見(jiàn)第6章),因此第二個(gè)聲明把p初始化成指向無(wú)名數(shù)組的第一個(gè)元素.為了編譯舊代碼,有的編譯器有一個(gè)控制字符中是否可寫(xiě)的開(kāi)關(guān)。參見(jiàn)問(wèn)題1.11、6.1、6.2和6.6。參芍資料:[K&R2,Sec.5.5p.104];[ISO,Sec.6.1.4,Sec.6.5.7];[Rationale,Sec.3.1.4];[H&S,Sec.2.7.4pp.31-2].我總算弄清除函數(shù)指針的聲明方法了,但怎樣才能初始化呢?用ド面這樣的代碼externintfunc();int(*fp)O=func;當(dāng)?個(gè)函數(shù)名出現(xiàn)在這樣的表達(dá)式屮時(shí),它就な“蛻變”成?個(gè)指針(即,?式地取出了它的地址),這有點(diǎn)類似數(shù)組名的行為。通常函數(shù)的顯示聲明需要事先知道(也許在?個(gè)頭文件中).因?yàn)榇颂幉](méi)有隱式的外部函數(shù)聲明(初始式中函數(shù)名并非一個(gè)函數(shù)調(diào)用的?部分)。參見(jiàn)問(wèn)鹿1.8和4.8。第2章結(jié)構(gòu)、聯(lián)合和枚舉問(wèn)題列表聲明structx1(...):和typedefstruct{...)x2;有什么不同?為什么structx{...};xthestruct;不對(duì)?ー個(gè)結(jié)構(gòu)可以包含指向自己的指針嗎?在C語(yǔ)言中實(shí)現(xiàn)抽象數(shù)據(jù)類型什么方法最好?

在C中是否有模擬繼承等面向?qū)ο蟪绦蛟O(shè)計(jì)特性的好方法?我遇到這樣聲明結(jié)構(gòu)的代碼:structname{intnamelcn;charnamestr[1];);然后乂使用?些內(nèi)存分配技巧使namestr數(shù)組用起來(lái)好像有多個(gè)元素.這樣合法和可移植嗎?是否有自動(dòng)比較結(jié)構(gòu)的方法?如何向接受結(jié)構(gòu)參數(shù)的函數(shù)傳入常數(shù)值?怎樣從/向數(shù)據(jù)文件讀/寫(xiě)結(jié)構(gòu)?我的編譯器在結(jié)構(gòu)中留下了空洞,這導(dǎo)致空間浪費(fèi)而且無(wú)法與外部數(shù)據(jù)文件進(jìn)行‘‘二進(jìn)制‘‘讀寫(xiě).能否關(guān)掉填充,或者控制結(jié)構(gòu)域的對(duì)齊方式?為什么sizeof返回的值大于結(jié)構(gòu)的期望值,是不是尾部有填充?如何確定域在結(jié)構(gòu)中的字節(jié)偏移?怎樣在運(yùn)行時(shí)用名字訪問(wèn)結(jié)構(gòu)中的域?程序運(yùn)行正確,但退出時(shí)卻“coredump”了,怎么回事?可以初始化ー個(gè)聯(lián)合嗎?枚舉和一組預(yù)處理的#define有什么不同?有什么容易的顯示枚舉值符號(hào)的方法?結(jié)構(gòu)、聯(lián)合和枚舉聲明structxl{...}:和typedefstruct,{...}x2Z有什么不同?第種形式聲明了一個(gè)“結(jié)構(gòu)標(biāo)簽?;第二種聲明了一個(gè)“類型定義”.主要的區(qū)別是付二丈中你需要用-structxl”引用第?種,而用、2”引用第一種?也就是いー 種抽象類新——用戶不必知道它足?個(gè)結(jié)構(gòu),而在聲明它的實(shí)例時(shí)也不需豊使用struct關(guān)鍵字.為什么structx{...}:xthestruct:不對(duì)?C不足C++.結(jié)構(gòu)標(biāo)簽不能門動(dòng)生成類型,參見(jiàn)問(wèn)題2.1.ー個(gè)結(jié)構(gòu)可以包含指向自己的指針嗎?當(dāng)然可以.參見(jiàn)問(wèn)題1.6.在C語(yǔ)言中實(shí)現(xiàn)抽象數(shù)據(jù)類型什么方法最好?讓客戶使用指向沒(méi)有公開(kāi)定義(也許還隱藏在類型定義后邊)的結(jié)構(gòu)類型的指針是ー個(gè)好辦法.只要不訪問(wèn)結(jié)構(gòu)成員,聲明和使用“匿名”結(jié)構(gòu)指針(不完全結(jié)構(gòu)類型指針)是合法的。這也是使用抽象數(shù)據(jù)類型的原因.在C中是否有模擬繼承等面向?qū)ο蟪绦蛟O(shè)計(jì)特性的好方法?把函數(shù)指針直接加入到結(jié)構(gòu)中就可以實(shí)現(xiàn)簡(jiǎn)單的“方法”.你可以使用各種不雅而暴力的方法來(lái)實(shí)現(xiàn)繼承,例如通過(guò)預(yù)處理器或含有“基類”的結(jié)構(gòu)作為開(kāi)始的子集,但這些方法都不完美.很明顯,也沒(méi)有運(yùn)算符的重載和置蓋(例如,“導(dǎo)出類”中的“方法''),那些必須人工去做。顯然的,如果你需要“真”的面向?qū)ο蟮某绦蛟O(shè)計(jì),你需要使用ー個(gè)支持這些特性的語(yǔ)さ,例如C++。我遇到這樣聲明結(jié)構(gòu)的代碼:structname{intnainelon:charnamestrfl];}:然后又使用一些內(nèi)存分配技巧使nainestr數(shù)組用起來(lái)好像有多個(gè)元素,這樣合法和可移植嗎?這種技術(shù)十分普遍,盡管DennisRitchie稱之為“和C實(shí)現(xiàn)的無(wú)保證的親密接觸,官方的解釋認(rèn)定它沒(méi)有嚴(yán)格遵守C標(biāo)準(zhǔn),盡管它看來(lái)在所有的實(shí)現(xiàn)中都可以工作.仔細(xì)檢查數(shù)組邊界的編譯器可能會(huì)發(fā)出警告.另種可能是把變長(zhǎng)的元素聲明為很大,而不是很小;在上例中:charnamestr[MAXSIZE];MAXSIZE比任何可能存儲(chǔ)的name值都大.但是,這種技術(shù)似乎也不完全符合標(biāo)準(zhǔn)的嚴(yán)格耕杼.這些“親密”結(jié)構(gòu)都必須小心使用,因?yàn)橹挥谐绦騿T知道它的大小,而編譯器卻一無(wú)所知.C99引入了“雙活數(shù)組域”概念,允許結(jié)構(gòu)的最后?個(gè)域省略數(shù)組大小.這為類似問(wèn)題提供了?個(gè)圓満的解決方案.參考資料:[Rationale,Sec.J;[C9X,Sec.].是否有自動(dòng)比較結(jié)構(gòu)的方法?沒(méi)有.編譯器沒(méi)有簡(jiǎn)單的好辦法實(shí)現(xiàn)結(jié)構(gòu)比較(即,支持結(jié)構(gòu)的==操作符),這也符合C的低層特性.簡(jiǎn)單的按字節(jié)比較會(huì)由于結(jié)構(gòu)中沒(méi)有用到的“空洞”中的隨機(jī)數(shù)據(jù)(參見(jiàn)問(wèn)題2.10)而失敗;而按域比絞在處理大結(jié)構(gòu)時(shí)需要難以接受的大SL重比代碼。如果你需要比較兩個(gè)結(jié)構(gòu),你必須自己寫(xiě)函數(shù)按域比較.ぎワ資料:F&R2,Sec.6.2p.129]:[Rationale,Sec.3.3.9];[H&S,Sec.5.6.2p.133],如何向接受結(jié)構(gòu)參數(shù)的函數(shù)傳入常數(shù)值?傳統(tǒng)的C沒(méi)有辦法生成匿名結(jié)構(gòu)值;你必須使用臨時(shí)結(jié)構(gòu)變顯或?個(gè)小的結(jié)構(gòu)生成函數(shù).C99標(biāo)準(zhǔn)引入了“復(fù)合常居"(compoundliterals);更合常充的,種形式就可以允許結(jié)構(gòu)常靈。例如,向假想plotpoin")函數(shù)傳入個(gè)坐標(biāo)對(duì)常數(shù),可以調(diào)用plotpoint((structpoint){1,2});*j"指定初始值"(designatedinitializers)(C99的另?個(gè)功能)結(jié)合,也可以用成員名稱確定成員值:plotpoint((structpoint)<.x=l,.y=2});參見(jiàn)問(wèn)題4.6.參考資料:[C9X.Sec.,Sec.6.5.8].

怎樣從/向數(shù)據(jù)文件讀/寫(xiě)結(jié)構(gòu)?用Erite()寫(xiě)ー個(gè)結(jié)構(gòu)相對(duì)簡(jiǎn)單:Iwrite(4somestruct,sizeotsomestruct,1,fp);對(duì)應(yīng)的fread()調(diào)用可以再把它讀回來(lái).但足這樣寫(xiě)出的文件卻不能移植(參見(jiàn)問(wèn)題2.10和20.3).同時(shí)注意如果結(jié)構(gòu)包含任何指針,則只有指針值會(huì)被寫(xiě)入文件,當(dāng)它們?cè)俅巫x回來(lái)的時(shí)候,很可能已經(jīng)失效.最后,為了廣泛的移植,你必須用,b”標(biāo)志打開(kāi)文件;參見(jiàn)問(wèn)題12.30。移植性更好的方案是寫(xiě)?對(duì)函數(shù),用可移值(可能甚至是人可讀)的方式按域讀寫(xiě)結(jié)構(gòu),盡管開(kāi)始可能匸作量稍大.參考資料:[H&S,Sec.15.13p.381].我的編譯器在結(jié)構(gòu)中留下了空洞.這導(dǎo)致空間浪費(fèi)而且無(wú)法與外部數(shù)據(jù)文件進(jìn)行“二進(jìn)制“讀寫(xiě)。能否關(guān)掉填充.或者控制結(jié)構(gòu)域的對(duì)齊方式?這些“空洞”充當(dāng)了“填充”,為了保持結(jié)構(gòu)中后面的域的對(duì)齊,這也許是必須的.為了髙效的訪問(wèn),許多處理器喜歡(或要求)多字節(jié)對(duì)象(例如,結(jié)構(gòu)中任何大「char的類型)不能處「隨意的內(nèi)存地址,而必須足2或4或?qū)ο蟠笮〉谋稊?shù).編譯器可能提供ー種擴(kuò)展用尸這種控制(可能是#pragma!參見(jiàn)問(wèn)題!1.21),但是沒(méi)有標(biāo)準(zhǔn)的方法.參見(jiàn)問(wèn)題20.3。參考資料:[K&R2.Sec.6.4p,138];[H&S,Sec.5.6.4p.135]=為什么sizeof返回的值大于結(jié)構(gòu)的期望值.是不是尾部有填充?為了確保分配連續(xù)的結(jié)構(gòu)數(shù)組時(shí)正確對(duì)齊,結(jié)構(gòu)可能有這種尾部埴充。即使結(jié)構(gòu)不足數(shù)組的成員,填充也會(huì)保持,以便sizeof能夠總是返回?致的大小.參見(jiàn)問(wèn)題2.1〇.參考資料:[H&S,Sec,5.6.7pp.139-40].如何確定域在結(jié)構(gòu)中的字節(jié)偏移?ANSIC在<stddef.h>中定義了offsetof()宏,用offisetof(Atructs,f)可以計(jì)算出域f在結(jié)構(gòu)s中的偏移量.如果出廣某種原因,你需要自己實(shí)現(xiàn)這個(gè)功能,可以使用下邊這樣的代碼:#defIneoffsetof(type,f)((size.t)\((char &((type/)〇)ー〉f-(char?)(type*)0))這種實(shí)現(xiàn)不足100%的可移植;某些編譯器可能會(huì)合法地拒絕接受.參考資料:[ISO,Sec.7.1.6];[Rationale,Sec.];[H&S,Sec.11.1pp.292-3].

怎樣在運(yùn)行時(shí)用名字訪問(wèn)結(jié)構(gòu)中的域?保持用。曲etof()(參見(jiàn)問(wèn)題2.12)計(jì)算的域偏移后?如果structp是個(gè)結(jié)內(nèi)賓體的指出,而域f是個(gè)整數(shù),它的偏移成是。版tf、f的值可以間接地設(shè)皆:*(lnt?)((char?)structp+offsetf)=value;程序運(yùn)行正確.但退出時(shí)卻"coredump-了,怎么回事?問(wèn)題程序:structlist{char?item;structlist?next;}/?這里是main程序?/main(argc,argv){...}缺少的ー個(gè)分號(hào)使main()被定義為返回一個(gè)結(jié)構(gòu).由于中間的注釋行,這個(gè)聯(lián)系不容易看出來(lái)?閃為一般上,返回結(jié)構(gòu)的函數(shù)任實(shí)現(xiàn)時(shí),會(huì)加入ー個(gè)隱含的返回指針,這個(gè)產(chǎn)生的main()函數(shù)代碼試圖接受三個(gè)參數(shù),而實(shí)際1.只有兩個(gè)傳入(這里,It]C的啟動(dòng)代碼傳入).參見(jiàn)問(wèn)題10.8和16.4.參考資料:[CT&P,Sec.2.3pp.21-2].可以初始化ー個(gè)聯(lián)合嗎?在厚來(lái)的ANSIC中,只行聯(lián)合中的第個(gè)命名成員可以被初始化.C99引入了??指定初始值”,可以用來(lái)初始化任意成員.參考資料:[K&R2,Sec.6.8pp.148-9];[ISO,Sec.6.5.7];[C9X,Sec.6.5.8];[H&S,Sec.4.6.7p,100]0枚舉和一組預(yù)處理的#define有什么不同?只有很小的區(qū)別。C標(biāo)準(zhǔn)中允許枚舉和其它整形類別白由混用而不會(huì)出情?(但是,假如編譯器不允許在未經(jīng)明痛類型轉(zhuǎn)換的情況ド混用這些類型,則聰明地使用枚挙可以捕捉到某些程序錯(cuò)誤.)廣的?些優(yōu)點(diǎn):自動(dòng)賦值;調(diào)試器I ' :リ以顯示符號(hào)值;它們服從數(shù)據(jù)塊作用域規(guī)則.(編譯器也可以對(duì)在枚塔變量被任意地和其它類型混用時(shí).廣’III中要的警方信息,因?yàn)檫@被認(rèn)為止壞風(fēng)格.)?個(gè)缺點(diǎn)是程序員イ、能控制這些對(duì)非単要的警告;有些程序員則反感r無(wú)法控制枚舉變盤的大小.參考資料:[K&R2,Sec.2.3p.39,Sec.A4.2p.196];[ISO.Sec.,Sec.6.5.2,Sec.,AnnexF];[H&S,Sec.5.5pp.127-9,Sec.5.11.2p.153].有什么容易的顯示枚舉值符號(hào)的方法?沒(méi)有.你可以寫(xiě)ー個(gè)小函數(shù),把,個(gè)枚舉常員值映射到字符中.(為了調(diào)試的目的,ー個(gè)好的調(diào)試器,應(yīng)該可以自動(dòng)顯示枚舉常最值符號(hào)。)

第3章表達(dá)式問(wèn)題列表:為什么這樣的代碼:ali]=i++;不能工作?使用我的編譯器,下面的代碼inti=7;printズ%d\n”,i++*i++);返回49?不管按什么順序計(jì)算,難道不該打印出56嗎?對(duì)于代碼inti=3;i=i++;不同編譯器給出不同的結(jié)果,有的為3,有的為4,哪個(gè)是正確的?這是個(gè)巧妙的表達(dá)式:a.=b.=a.=b它不需要臨時(shí)變量就可以交換a和b的值。我可否用括號(hào)來(lái)強(qiáng)制執(zhí)行我所需要的計(jì)算順序?可是&&和II運(yùn)算符呢?我怎樣才能理解復(fù)雜表達(dá)式?“序列點(diǎn)”是什么?那么,對(duì)于a[i]=i++;我們不知道a[]的哪ー個(gè)分量會(huì)被改寫(xiě),但i的確會(huì)增加1,對(duì)嗎?++i和i++有什么區(qū)別?如果我不使用表達(dá)式的值,我應(yīng)該用++i或i++來(lái)自增ー個(gè)變量嗎?為什么如下的代碼inta=100,b=100;longintc=a*b;不能工作?我需要根據(jù)條件把?個(gè)復(fù)雜的表達(dá)式賦值給兩個(gè)變量中的?個(gè)。為什么這樣的代碼:a[i]=i++;不能工作?子表達(dá)式i++有?個(gè)副作用——它會(huì)改變i的值一由Fi在同表達(dá)式的其它地方被引用, 一 川斯該引用(ム道的a同中)是舊值還是新值.(注意,盡管在K&R中建議這類表達(dá)式的行為不確定,但C標(biāo)準(zhǔn)卻強(qiáng)烈聲明它是無(wú)定義的,參見(jiàn)問(wèn)題11.32。.若資料:[K&R1,Sec.2.12];[K&R2,Sec.2.12];[ISO,Sec.6.3];[H&S,Sec.7.12pp.227-9]0使用我的編譯器.下面的代碼inti=7:priutfド%,d\u".i++*i++);返回49?不管按什么順序計(jì)算,難道不該打印出56嗎?盡管后緞自加和后綴自減操作苻++和一-在輸出其Iロ值之后オ會(huì)執(zhí)行運(yùn)算,但這里的メ之后、常常被誤解。沒(méi)有仟何保證確保門増或自減會(huì)在輸出變量原值之后和對(duì)表達(dá)式的其它部分進(jìn)行計(jì)算之前立即進(jìn)行?也不能保證變鼠的更新會(huì)在表達(dá)式“完成”(按照ANSIC的術(shù)語(yǔ),在ドー個(gè)“序列點(diǎn)”之前,參見(jiàn)問(wèn)題3.7)之前的某個(gè)時(shí)刻進(jìn)行?本例中,編譯器選擇使用變成的舊值相乘以后再對(duì)二音進(jìn)行自增運(yùn)算.包含多個(gè)不確定的副作用的代碼的行為總是被認(rèn)為未定義.(簡(jiǎn)單而言,“多個(gè)不確定副作用’’是指在同?個(gè)表達(dá)式中使用導(dǎo)致同一對(duì)象修改兩次或修改以后又被引用的自増,自減和賦值操作符的任何組合.這是?個(gè)粗略的定義;嚴(yán)格的定義?見(jiàn)問(wèn)題3;.?レヒビ的含義"見(jiàn)何?1し32?)甚至都イ、要試圖探究這些東西在你的編譯器中是如何實(shí)現(xiàn)的(這與許多C教科書(shū)上的弱智練習(xí)正好相反);正如K&R明智地指出,“如果你不知道它們?cè)诓煌臋C(jī)器上如何實(shí)現(xiàn),這樣的無(wú)知可能恰恰會(huì)有助于保護(hù)你?!眳⒖假Y料:[K&R1,Sec.2.12p.50];[K&R2,Sec.2.12p.54];(ISO,Sec.6.3];[H&S,Sec.7.12pp.227-9];[CT&P,Sec.3.7p,47];[PCS,Sec.9.5pp.120-1].對(duì)于代碼inti=3:i=i++:不同編譯器給出不同的結(jié)果,有的為3.有的為4.哪個(gè)是正確的?沒(méi)有正確答案;這個(gè)表達(dá)式無(wú)定義.參見(jiàn)問(wèn)題3.1,3.7和11.32.同時(shí)注意.i++和++i都不同于i+l?如果你要使i自増1,使用i=i+l,i+=l,i++或++i,而不是任何組合,參見(jiàn)問(wèn)題3.10.這是個(gè)巧妙的表達(dá)式:a*=b*=a*=b它不需要臨時(shí)變?就可以交換n和b的值。這不具有可移植性.它試圖在序列點(diǎn)之間兩次修改變員a,而這是無(wú)定義的.例如,有人報(bào)キ如ド代碼:inta=123,b=7654;a*=b*=a*=b;在SCO優(yōu)化C編譯器(icc)下會(huì)把b置為123,把a(bǔ)買為〇,蔘見(jiàn)問(wèn)題3.1、3.7和20.14.我可否用括號(hào)來(lái)強(qiáng)制執(zhí)行我所需要的計(jì)算順序?-?般來(lái)講,不行.運(yùn)算符優(yōu)先級(jí)和括弧只能賦予表達(dá)是計(jì)算部分的順序.在如ド的代碼中1()+g()?n()盡管我們知道乗法運(yùn)算在加法之前,但這并不能說(shuō)明這三個(gè)函數(shù)哪個(gè)會(huì)被首先調(diào)用?如果你兩要確保子衣達(dá)式的計(jì)算順序,你可能需要使用明確的臨時(shí)變畐和獨(dú)立的語(yǔ)句.參考資料:[K&R1,Sec.2.12p.49,Sec.A.7川;[K&R2,Sec.2.12pp.52-3,Sec.A.7p.200.].可是&&和I(運(yùn)算符呢?我看到過(guò)類似while((c=getchar())!=EOF&&c!=へi/)的代碼 這些運(yùn)算符在此處有個(gè)特殊的“短路”例外:如果左邊的子表達(dá)式ヨ版而線結(jié)果(即.貞對(duì)アII和假對(duì)于&&)則右邊的子表達(dá)式不會(huì)計(jì)算。因此,從左至厶的計(jì)算可以確保,對(duì)逗號(hào)表達(dá)式也是如此.而且,所有這些運(yùn)算符(包括?:)都會(huì)引入?個(gè)額外的內(nèi)部序列點(diǎn)(參見(jiàn)何胭3.7).參考資料:[K&R1,Sec.2.6p.38,Secs.A7.11-12pp.190-1];[K&R2,Sec.p.41,Secs.A7.14-15pp.207-8];[ISO,Sec.6.3.13,Sec.6.3,14,Sec.6.3.15];[H&S,Sec.7.7pp.217-8,Sec.7.8pp.218-20,Sec.7.12.1p.229];[CTfcP,Sec.pp.46-7]?

我怎樣才能理解復(fù)雜表達(dá)式???序列點(diǎn)”是什么?序列點(diǎn)足個(gè)時(shí)間點(diǎn)(在整個(gè)表達(dá)式全部計(jì)算完畢之后或在II、&&、?:或過(guò)號(hào)運(yùn)算符處,或在函數(shù)調(diào)用之前),此刻塵埃落定,所有的副作用都已確保結(jié)束。ANSpISOC標(biāo)準(zhǔn)這樣描述:在上一個(gè)和ヤ個(gè)序列點(diǎn)之間,ー個(gè)對(duì)象所保存的值至多只能被表達(dá)式的計(jì)算修改?次。而且前,個(gè)值只能用r決定將要保存的值。第二句話比較費(fèi)解.它說(shuō)在ー個(gè)表達(dá)式中如果某個(gè)對(duì)象需要寫(xiě)入,則在同表達(dá)式中對(duì)該對(duì)象的訪問(wèn)應(yīng)該只局限ア直接用于計(jì)算將要寫(xiě)入的值.這條規(guī)則有效地限制了只有能確保 二Jク訪問(wèn)變量的表達(dá)式為合法.例如i=i+l介法,而a[i]=i++則非法(參見(jiàn)問(wèn)題3.1).參見(jiàn)ド邊的問(wèn)題3&ぢ考資?1:[ISO,Sec.,Sec.6.3,Sec.6.6.AnnexC];[Rationale.Sec.212.3];[H&S.Sec.7.12.1pp.228-9].那么,對(duì)于a[i]=i++:我們不知道a[]的哪ー個(gè)分量會(huì)被改寫(xiě).但i的確會(huì)増加1.對(duì)嗎?不?定!如果?個(gè)表達(dá)式和程序變得未定義,則它的所有方面都會(huì)變成未定義?參見(jiàn)問(wèn)題3.2,3.3,11.32和11.35.++i和i++有什么區(qū)別?如果你的C語(yǔ)さ書(shū)沒(méi)有說(shuō)明它們的區(qū)別,那么買本好的.得單而二:++i在i存儲(chǔ)的值上増加一并向使用它的表達(dá)式I?返冋”新的,増加后的值;而i++對(duì)i増加ー,但返冋原來(lái)的是未增加的值。如果我不使用表達(dá)式的值.我應(yīng)該用++i或i++來(lái)自增ー個(gè)變量嗎?由于這兩種格式區(qū)別僅在F生成的值,所以在僅使用它們的副作用時(shí),-?者完全?樣.但是,在C++中,朝綴方式卻是苜選?參見(jiàn)問(wèn)題3.3?為什么如下的代碼inta=1(M).b=100:longintc=a*b:不能工作?根據(jù)C的內(nèi)部類型轉(zhuǎn)換規(guī)則,乘法是用int進(jìn)行的,而其結(jié)果可能在轉(zhuǎn)換為long型并賦給左邊的c之前溢出或被截短.可以使用明確的類型轉(zhuǎn)換,強(qiáng)迫乘法以long型進(jìn)行:longIntc=(longint)a*b;

注意,(longinり(a*b)不能達(dá)到需要的效果。當(dāng)兩個(gè)整數(shù)做除法而結(jié)果賦與一個(gè)浮點(diǎn)變成時(shí),也有可能有同樣類型的同期,解決方法也讓類似的.參ワ資料:[K&RLSec.2.7p.41];[K&R2,Sec.2.7p.44];[ISO,Sec.]:[H&S,使用我的編輯器,下面的代碼];[CT&P,Sec.3.9pp.49-50].我需要根據(jù)條件把ー個(gè)復(fù)雜的表達(dá)式賦值給兩個(gè)變量中的ー個(gè)??梢杂孟?邊這樣的代碼嗎?((condition)?a:b)=coinpli-cated_expression;不能.?:操作符,跟多數(shù)操作符一?樣,生成一個(gè)值,而不能被賦值.換さ之,?:不能生成一個(gè)“左值”.如果你真的需要,你可以試試ド面這樣的代碼:?((condition)?£a:ftb)=complicated.expression;盡管這事無(wú)優(yōu)雅可京.參考資料:[ISO.Sec.6.3.15]:[H&S,Sec.7.1pp.179-180].第4章指針問(wèn)題列表:我想聲明一個(gè)指針并為它分配ー些空間,但卻不行。這些代碼有什么問(wèn)題?char*p;*p=malloc(10);*p++自增p還是p所指向的變量?我有一個(gè)char?型指針正巧指向一些int型變量,我想跳過(guò)它們.為什么如下的代碼((int*)p)++;不行?我有個(gè)函數(shù),它應(yīng)該接受并初始化一個(gè)指針voidf(int*ip){staticintdummy=5;ip=&dummy;}但是當(dāng)我如下調(diào)用時(shí):int*ip;f(ip);調(diào)用者的指針卻沒(méi)有任何變化。我能否用void**指針作為參數(shù),使函數(shù)按引用接受一般指針?我有個(gè)函數(shù)extemintf(int*);它接受指向int型的指針。我怎樣用引用方式傳入?個(gè)常數(shù)?C有“按引用傳遞”嗎?我看到了用指針調(diào)用函數(shù)的不同語(yǔ)法形式。到底怎么回事?我怎樣把ー個(gè)int變量轉(zhuǎn)換為char?型?指針我想聲明一個(gè)指針并為它分配ー些空間.但卻不行。這些代碼有什么問(wèn)題?char*p;*p=malloc(lO):你所聲明的指針是p,而不足?p,當(dāng)你操作指針木身時(shí)(例如當(dāng)你對(duì)其賦值,使之指向別處時(shí)),你只需要使用指針的名字即可:p=malloc(lO);當(dāng)你操作指計(jì)指向的內(nèi)存時(shí),你オ靜要使用?作為間接操作符:?p=H;參見(jiàn)問(wèn)題1.7,7.1,7.5和&3,參考資料:[CT&P,Sec.3.1p.28].*p++自增p還是p所指向的變■?后綴++和一操作符本質(zhì)上比前綴?目操作的優(yōu)先級(jí)髙,因此?p++和*(p++)ヽ;價(jià).它門增p并返冋p門増之前所指向的值。要自増p指向的值,使用ドp)++,如果副作用的順序無(wú)關(guān)緊要也可以使用++*p。參考資料:M&RLSec.5.1p.91];[K&R2,Sec.5.1p,95];[ISO,Sec.6.3.2,Sec.6.3.3];[H&S,Sec.7.4.4pp.192-3.Sec.7.5p.193,Secs.7.5.7,7.5.8pp.199-200],我有一個(gè)char?型指針正巧指向ー些int型變量.我想跳過(guò)它們。為什么如下的代碼((iiit*)p)++:不行?住C語(yǔ)育中,類型轉(zhuǎn)換意味昔“把這些二進(jìn)制位看作另ー種類型,并作相應(yīng)的對(duì)待”;這是個(gè)轉(zhuǎn)換操作符,根據(jù)定義它只能生成?個(gè)右值(rvalue)。而右值既不能賦值,也不能用++門増.(如果編譯器支持這樣的擴(kuò)展,那要么是ー個(gè)錯(cuò)誤,要么是有意作出的非標(biāo)準(zhǔn)擴(kuò)展.)要達(dá)到你的目的可以用:p=(char?)((int*)p+1);或者,因?yàn)閜是char?型,直接用p+=slzeof(Int);但是,在Q/能的情況ド,你還是應(yīng)該首先選擇適當(dāng)?shù)闹羔橆愋?而不足味地試圖李代桃僵.參考資料:[K&R2,Sec.A7.5p.205];[ISO.Sec.6.3.4]:[Rationale,Sec.3.324];[H&S,Sec.7.1pp.179-80].我有個(gè)函數(shù),它應(yīng)該接受并初始化一個(gè)指針voidf(int*ip){staticint(luininy=5;ip=&:(luinniy:}但是當(dāng)我如下調(diào)用時(shí):inf*ip:f(ip):調(diào)用者的指針卻沒(méi)有任何變化。你確定函數(shù)初始化的足你希望它初始化的東西嗎?請(qǐng)記住任C中,參數(shù)是通過(guò)值傳遞的?被調(diào)函數(shù)儀僅修改了傳入的指針副本?你褥要傳入指針的地址(函數(shù)變成接受指針的指針),或薦讓函數(shù)返冋指針.參見(jiàn)問(wèn)趣!15和4.7.我能否用void**指針作為參數(shù).使函數(shù)按引用接受一般指針?不可移植.C中沒(méi)有?般的指針的指針類型.void?可以用作一般指針只是因?yàn)楫?dāng)它和其它類型相互賦值的時(shí)候,如果需要,它可以門動(dòng)轉(zhuǎn)換成其它類型;但是,如果試圖這樣轉(zhuǎn)換所指類型為void?之外的類型的void**指針時(shí),這個(gè)轉(zhuǎn)換不能完成?我有一個(gè)函數(shù)externintf(int*):它接受指向int型的指針。我怎樣用引用方式傳入ー個(gè)常數(shù)?下面這樣的調(diào)用f(&5):似乎不行。在C99中,你可以使用“復(fù)合常員:f((lnt[]){5});在C99之前,你不能直接這樣做;你必須先定義?個(gè)臨時(shí)變量,然后把它的地址傳給函數(shù):intfive=5;f(fefive);參見(jiàn)問(wèn)題2.8,4.4和20.LC有“按引用傳遞”嗎?真的沒(méi)有.嚴(yán)格地詢,C總是按值傳遞.你可以門已模擬按引用傳遞,定義接受指針的函數(shù),然后在調(diào)用時(shí)使用&操作符.K實(shí)上,當(dāng)你向函數(shù)傳入數(shù)組(傳入指針的情況參見(jiàn)問(wèn)題6.4及其它)時(shí),編譯器本質(zhì)ヒ就足在模擬按引用傳遞。但是C沒(méi)有任何真正、L同「「大的按引用傳遞或C++的引用參數(shù)的東西.另ー方面,類似函數(shù)的預(yù)處理宏可以提供ー種“按名稱傳遞''的形式.參見(jiàn)問(wèn)題4.4和20.1.參考資料:[K&R1,Sec.1.8pp.24-5,Sec.5.2pp.91-3];[K&R2,Sec.1.8pp.27-8,Sec.5.2pp.95-7];[ISO,Sec.];[H&S,Sec.9.5pp.273-4].

我看到了用指針調(diào)用函數(shù)的不同語(yǔ)法形式。到底怎么回事?最初,個(gè)函數(shù)指針必須用*操作符(和一對(duì)額外的括弧)“轉(zhuǎn)換為”ー個(gè)“直正的’‘函數(shù)才能調(diào)用:intr,func(),(*tp)〇=Tunc;r=(*fp)();而函數(shù)總是通過(guò)指針進(jìn)行調(diào)用的,所有“真正的”函數(shù)名息是陷式的退化為指針(在表達(dá)式中,正如在初始化時(shí)ー樣,夢(mèng)見(jiàn)問(wèn)題1.14).這個(gè)推論表明無(wú)論用足函數(shù)名和函數(shù)的指針r?fp();ANSIC標(biāo)準(zhǔn)實(shí)際上接受后邊的解釋,這意味著?操作符不再需要,盡管依然允許.夢(mèng)見(jiàn)問(wèn)卷1.14.參考資料:[K&R1.Sec.5.12p.116];[K&R2,Sec.5.11p.120];[ISO,Sec..2.2];[Rationale,Sec,3.322];[H&S,Sec.5.8p.147,Sec.7.4.3p.190]=我怎樣把ー個(gè)int變■轉(zhuǎn)換為char?型?我試了類型轉(zhuǎn)換,但是不行。這取決于你希望做什么.如果你的類型轉(zhuǎn)換不成功,你可能是企圖把整數(shù)轉(zhuǎn)為字符串,這種情況參見(jiàn)問(wèn)麗13.1。如果你試圖把整數(shù)轉(zhuǎn)換為字符,參見(jiàn)問(wèn)題8.4.如果你試圖計(jì)?個(gè)指針指向特定的內(nèi)存地址,參見(jiàn)問(wèn)題19.29.第5章空(null)指針問(wèn)題列表:5.!臭名昭著的空指針到底是什么?怎樣在程序里獲得一個(gè)空指針?用縮寫(xiě)的指針比較“if(p)”檢查空指針是否可靠?如果空指針的內(nèi)部表達(dá)不是〇會(huì)怎么樣?NULL是什么,它是怎么定義的?在使用非全零作為空指針內(nèi)部表達(dá)的機(jī)器匕NULL是如何定義的?如I果NULL定義成#defineNULL((char*)0)難道不就可以向函數(shù)傳入不加轉(zhuǎn)換的NULL了嗎?如果NULL和。作為空指針常數(shù)是等價(jià)的,那我到底該用哪ー個(gè)呢?但是如果NULL的值改變了,比如在使用非零內(nèi)部空指針的機(jī)器匕難道用NULL(而不是〇)不是更好嗎?用預(yù)定義宏#defineNullptr(type)(type*)0幫助創(chuàng)建正確類型的空指針。這有點(diǎn)奇怪。NULL可以確保是〇,但空(null)指針卻不一定?

為什么有那么多關(guān)于空指針的疑惑?為什么這些問(wèn)題如此經(jīng)常地出現(xiàn)?我很困惑。我就是不能理解這些空指針?類的東西??紤]到有關(guān)空指針的所有這些困惑,難道把要求它們內(nèi)部表達(dá)都必須為〇不是更簡(jiǎn)單嗎?說(shuō)真的,真有機(jī)器用非零空指針嗎,或者不同類型用不同的表達(dá)?運(yùn)行時(shí)的“空指針賦值”錯(cuò)誤是什么意思?空(111山)指針5.!臭名昭著的空指針到底是什么?語(yǔ)キ定義中說(shuō)明,毎ー種指針類型都有一個(gè)特殊值——“空指針”——它與同類型的其它所有指針值都不相同,它“與任何對(duì)象或函數(shù)的指針值都不相等”.也就是說(shuō),取地址操作符&永遠(yuǎn)也不能得到空指針,同樣對(duì)maUoc()的成功調(diào)用也不會(huì)返冋空指針,如果失敗,malloc()的確返冋空指針,這足空指針的典里用法:&示“未分配”或者“尚未指向任何地方”的指針.空指針在概念上不同于未初始化的指針.空指針可以確保不指向任何對(duì)象或函數(shù);而未初始化指針則可能指向任何地方.參見(jiàn)問(wèn)題/

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論