版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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)第1章聲明和初始化問(wèn)題:我如何決定使用那種整數(shù)類(lèi)型?64位機(jī)上的64位類(lèi)型是什么樣的?怎樣定義和聲明全局變量和函數(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(lO);編譯器提示“非法初始式‘‘云云。以下的初始化有什么區(qū)別?chara[]="stringliteral";char*p="stringliteral";當(dāng)我向p[i]賦值的時(shí)候,我的程序崩潰了。我總算弄清除函數(shù)指針的聲明方法了,但怎樣才能初始化呢?第1章聲明和初始化我如何決定使用那種整數(shù)類(lèi)型?如果需要大數(shù)值(大于32,767或小于ー32,767),使用long型.否則,如果空間很重要(如有大數(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)類(lèi)型。但是,要注意在表達(dá)式中混用有符號(hào)和無(wú)符號(hào)值的情況。盡管字符類(lèi)型(尤其是無(wú)符號(hào)字符型)可以當(dāng)成“小”整型使用,但由于不可預(yù)知的符號(hào)擴(kuò)展和代碼增大有時(shí)這樣做可能得不償失。使用無(wú)符號(hào)字符型有所幫助;類(lèi)似的問(wèn)題參見(jiàn)問(wèn)題12.1.在選擇浮點(diǎn)型和雙精度浮點(diǎn)型時(shí)也有類(lèi)似的權(quán)衡。但如果?個(gè)變量的指針必須為特定的類(lèi)型時(shí),以上規(guī)則不再適用.如果因?yàn)槟撤N愫因你需要聲明?個(gè)有嚴(yán)格大小的變質(zhì),確保象C99的<int-types.h>那樣用某種適當(dāng)?shù)膖ypedef封裝這種選擇。通常,這樣做唯?的好原因足試圖符合某種外部強(qiáng)加的存儲(chǔ)方案,請(qǐng)參見(jiàn)同題20.3。如果你需要操作超過(guò)C的內(nèi)置類(lèi)型支持的超大變量,請(qǐng)參見(jiàn)問(wèn)題!8.17.參考資料:[K<kRl,Sec.2.2p.34];[K&R2,Sec.2.2p.36,Sec.A4.2pp.195-6,Sec.Bllp.257];[ISO,Sec..1,Sec.6.125];[H&S,Secs.5.1,5.2pp.110-114].64位機(jī)上的64位類(lèi)型是什么樣的?C99標(biāo)準(zhǔn)定義了!onglong類(lèi)型,其長(zhǎng)度可以保證至少64位,這種類(lèi)型在某些編譯器上實(shí)現(xiàn)己經(jīng)頗有時(shí)口了.其它的編譯器則實(shí)現(xiàn)了類(lèi)似」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)潴?致,同時(shí)也兼容大多數(shù)ANSI前的編譯器和連接器.Unix編譯器和連接器通常使用“通用模式”允許多車(chē)定義,只要保證最多對(duì)ー處進(jìn)行初始化就可以了;ANSIC標(biāo)準(zhǔn)稱(chēng)這種行為為“公共擴(kuò)展<',沒(méi)有語(yǔ)帶雙關(guān)的意思.可以使用懂處理技巧來(lái)使類(lèi)似DEFINE(int,1);的語(yǔ)句在ー個(gè)頭文件中只出現(xiàn)一次,然后根據(jù)某個(gè)宏的設(shè)定在需要的時(shí)候轉(zhuǎn)化成定義或聲明。但不潔楚這樣的麻煩是否值得.如果希望讓編譯器檢査聲明的一致性,一定要把全局聲明放到頭文件中?特別是,永遠(yuǎn)不要把外部函數(shù)的原型放到.C文件中:通常它與定義的一致性不能得到檢査,而矛盾的原型比不用還槽桂。參見(jiàn)問(wèn)題10.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].它可以用作?種格式上的提示表明函數(shù)的定義可能在另一個(gè)源文件中,但在externint1();和intf0;之間并沒(méi)有實(shí)質(zhì)的區(qū)別.參考資料:[ISO,Sec.6.1.2.2,Sec.6.5,1];[Rationale,Sec.3.1.2.2];[H&S,Secs..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].我似乎不能成功定義ー個(gè)鮭表°我試過(guò)ty]M'イ「f{char+it<iu:NODEPTRurxt:}"NODEPIR:但是編徑器報(bào)了錯(cuò)誤信目。難道在〇喏言中一個(gè)結(jié)構(gòu)不能包含指冋自己的指針嗎?C厝,屮口叫構(gòu)節(jié)セnJ以包"#II由i:P&R2, 6.51]二淪卬例デ3;明了達(dá)デ,NODEPTR化:-的間匙[/[二?]next:戔的時(shí)バ(ypedef"設(shè)育ホムキ了解決這外網(wǎng)取?先Mアナ個(gè)拈構(gòu)?。林《rstructnode")"]二,HWFext"或?yàn)?structnode或『I開(kāi)typedef定義行”構(gòu)定《.此?㈣吝/桑納以ド上個(gè)修設(shè)后的成心structnode{char?ltem;structnode*next;);typedefstructnode?NODEPTR;.少汪白‘種‘,"fI-的方リ.解,;、は1、リ親仁一typedef疋義"相弓!用的曲カ結(jié)構(gòu)時(shí)也—とマ的同子,可以?xún)型嗟姆椒ń鉀Q.冬見(jiàn)同虺2.1¥り資料:[K&R1.Sec.G.5p,101][K&R2.Sec.6.5p,139];[ISO.Sec.6.5.2,Sec6.523]:[H'S,Sec5.61pp.132-3]怎樣建立和理解非常復(fù)雜的聲明?例如定義ー個(gè)包含N個(gè)指向返回指向字符的指針的茁數(shù)的指針的數(shù)組?退個(gè)問(wèn)ぐ至少有以ト3種右案:-char?(?(aa[N])())();.用typedef菱し,;或聲明:typedefchar*pc;/?寸苻指針?/typedeipcipc();ハヒけ苻指針的隕數(shù)*/rypedetfpc*pfpc;/? 而函數(shù)的指よ?/typedefpipefpfpcO;/?返冋陋數(shù)描針的味數(shù)?/typedeifpfpc?pfptpc;ハル畫(huà)數(shù)的指針?/pfpfpca[N];/? お指計(jì)的數(shù)組?/.使用cdeclMア,它可K把英文翻譯成C或并把C取譯成貝文:cdecl>declareaasarrayofpointertofunctionreturningpointertofunctionreturningpointertocharchar?(?(?a[])0)0通過(guò)類(lèi)型轉(zhuǎn)換,cdec!也可以用「解擇復(fù)雜的聲叨,指出t數(shù)應(yīng)該進(jìn)入哪?對(duì)括號(hào)(如同位!述的復(fù)雜函數(shù)定義Iり.一見(jiàn)何懸!81木好的C語(yǔ)言書(shū)都會(huì)解釋如何“從內(nèi)到外”解釋和理解這樣復(fù)雜的C語(yǔ);聲明(“模擬聲明使用")。|二文的例子中的函數(shù)指針聲明還沒(méi)4包括參數(shù)類(lèi)型信息。如果參數(shù)行復(fù)雜類(lèi)型,聲明就會(huì)變得真正的混亂了?,F(xiàn)代的cdecl版木可以提供幫助.參考資料:[K&R2,Sec.5.12p.122];[ISO,Sec.6.5ff(esp.Sec.654)];[H助S,Sec.4.5pp.85-92.Sec.5.10.1pp.149-50]函數(shù)只定義了一次.調(diào)用了一次.但編譯器提示非法重定義了。在范用內(nèi)沒(méi)行聲明就調(diào)用(可能是第?次調(diào)用在函數(shù)的定義之前)的函數(shù)般認(rèn)為返回整型(迎)(且沒(méi)有任何參數(shù)類(lèi)弐息),如果函數(shù)在后邊聲明或定義成其它類(lèi)型就會(huì)導(dǎo)致矛盾.所。函數(shù)(非整型函數(shù)定変)必須在調(diào)用之前聲明。另ー個(gè)可能的原因是該函數(shù)」某個(gè)頭文件中聲明的カ?個(gè)函數(shù)同名。參見(jiàn)問(wèn)題11.4和15.1參考資料:[K&Rl,Sec.4.2p.70]:[K\rR2.Sec.4.2p.72];[ISO.Sec.G.3.2.2];[H&S,Sec.4.7p.101].inain()的正確定義是什么?voidinain()正確嗎?參見(jiàn)問(wèn)題!1.11到11.16.(這樣的定義不正確).代碼inff(){<li;n;?[]="H<llo.world!":}不能編譯〇??依,E用的史ANSI之而的端ぐ國(guó),小イ、匕手"as(automaticaggregates.miIIぬ態(tài)左ス;數(shù)如、/構(gòu)和郎言)的例始化V見(jiàn)向庭11.28這樣的初始化有什么問(wèn)題?<h:ir?卩=inallo<(10):編怪器受示??非法初始式“云云。「,:」.’い「スナ,;」:,,,.一,“一 '.,'I.靜志克斌)的樹(shù)始式中以下的初始化有'什么區(qū)別?《hnr"°="stringIit?'ral":char+p="stringliteral":當(dāng)我向p[i]賦值的時(shí)候.我的程序麗潰ア〇<'I-'1-I!,l< 「川衆(zhòng)河”’歩さ「小,”chara。!;中),它指明該數(shù)組I「『パ的何始值其它怙,兄ド,ピ會(huì)轉(zhuǎn)化為卜無(wú)名的的.*7.「「「ー’;工,ミレンユ?_iL屮,數(shù)組邇常被;,間轉(zhuǎn)化為1、指針("見(jiàn)第G韋),內(nèi)ル決や亡此三p初始化成指向無(wú)名數(shù)的21、市4\為r竭-in代碼.ズ的編譯ーム —t一3可可的卄イ?見(jiàn)間題1」1、6.1、6.2K16.6.”.:t-v:rl[K<!cR2,Sec55p104]:[ISO.Sec.G.l4.Sec.6.5,7].[Rationale.See.3.14]:[H&S,Sec.2.7.4pp31-2]201I年計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言常見(jiàn)問(wèn)題(2)第2章結(jié)構(gòu)、聯(lián)合和枚舉問(wèn)題列表聲明structxl{...};和typedefstruct{...}x2;有什么不同?為什么structx{...);xthestruct:不對(duì)?ー個(gè)結(jié)構(gòu)可以包含指向自己的指針嗎?在C語(yǔ)言中實(shí)現(xiàn)抽象數(shù)據(jù)類(lèi)型什么方法最好?在C中是否有模擬繼承等面向?qū)ο蟪绦蛟O(shè)計(jì)特性的好方法?我遇到這樣聲明結(jié)構(gòu)的代碼:structname{intnamelen;charnamestr[l];}:然后又使用ー些內(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í)用名字訪(fǎng)問(wèn)結(jié)構(gòu)中的域?程序運(yùn)行正確,但退出時(shí)卻“coredump"了,怎么回事?可以初始化ー個(gè)聯(lián)合嗎?枚舉和一組預(yù)處理的#define有什么不同?有什么容易的顯示枚舉值符號(hào)的方法?結(jié)構(gòu)、聯(lián)合和枚舉聲明structxl{...}:和typc<k,fstruct.{...}x2:有什么不同?■ ,ゝ<|i'=J」リ.を,,<”1,If?-7:セゼI股的區(qū)別と住后ス屮你掲要用“structxl”引用說(shuō)樸,同比“x2”引川冷れ.也就セ說(shuō),第種聲明更像種抽象類(lèi)新一用戶(hù)不必知道它是外結(jié)構(gòu),實(shí)例/也イ需般使用structよ.說(shuō)]為什么structx{...};xthostnut:不對(duì)?C"C++ 1'. ' !」.一I」,,ム2」ー個(gè)結(jié)構(gòu)可以包含指向自己的指針嗎??%nf以?與見(jiàn)河區(qū)LU在C語(yǔ)言中実現(xiàn)抽象數(shù)據(jù)類(lèi)型什么方法最好????!使用聞二T4公卄定((也汴還隠藏在類(lèi)型定ズかめ)ホ品構(gòu)?ア:.?-ケ好辦法 ;セイ、;デリ站構(gòu)成員,聲咽和使用繾名”結(jié)構(gòu)指桿(不構(gòu)類(lèi)型指針)足.’泣的.達(dá)也止使用抽拿數(shù)國(guó)類(lèi)型的原因.在C中是否有模擬繼承等面向?qū)ο蟪绦蛟O(shè)計(jì)特性的好方法?把函數(shù)指針直接加入到結(jié)構(gòu)中就可以實(shí)現(xiàn)簡(jiǎn)單的“方法”.你可以使用各種不雅而暴力的方法來(lái)實(shí)現(xiàn)繼承,例如通過(guò)預(yù)處理器或含有“基類(lèi)”的結(jié)構(gòu)作為開(kāi)始的子集,但這些方法都不完美?很明顯,也沒(méi)有運(yùn)算符的重載和國(guó)蓋(例如,“導(dǎo)出類(lèi)”中的“方法”),那些必須人工去做。顯然的,如果你需要“真”的面向?qū)ο蟮某绦蛟O(shè)計(jì),你繡要使用ー個(gè)支持這些特性的語(yǔ)言,例如C++。我遇到這樣聲明結(jié)構(gòu)的代碼:structname{infnainekn:charnaiiH'sh[l]:}:然后又使用一些內(nèi)存分配技巧使naiiicbtr數(shù)蛆用起來(lái)好像有多個(gè)元素,這樣合法和可移植嗎?這種技ギ十分講尚,盡斡DennisRitchie稱(chēng)之為“知C’實(shí)現(xiàn)的無(wú)保:E的親密拉:.,的餅杯認(rèn)定它沒(méi)行嚴(yán)格遵守C標(biāo)準(zhǔn).盡論它。朱従所有的實(shí)現(xiàn)中都可以工作。仔細(xì)口で數(shù)組邊界的編譯器可能會(huì)發(fā)出警].ガ種可能一把變長(zhǎng)的元家聲明為很大,而イ、是很小;在I一中:charnamestr[MAXSIZE];MAXSIZE比?何可隹存儲(chǔ)的name值都大?伊止,セ科技術(shù)似乎也イ、一全河合標(biāo)準(zhǔn)的嚴(yán)格解狎.這些嘖ナ結(jié)構(gòu)郡必雙小心使用,因?yàn)橹回陿幼謫T知道它的大小,而里厚芻卻無(wú)所知.<799「、「??一? Ir■ ,類(lèi)似間迎限供T個(gè)同酒的解決方案なワ德利:[Rationale.Sec35.4.2];[C9X.Sec.6.5.2,1]是否有自動(dòng)比較結(jié)構(gòu)的方法?沒(méi)目.編譯緡沒(méi)有用単的“辦法實(shí)現(xiàn)常ド卄メ<:「し:"Jレ!==. ,.這也符合C的低な特件簡(jiǎn)単的按字節(jié)比發(fā)會(huì)由」站構(gòu)中沒(méi)田M到的“空河”Q的隨機(jī)數(shù)據(jù)(蒙見(jiàn)同?82.10)j失敗;而按域比較在處理大結(jié)構(gòu)時(shí)需腹難以接大病中旦代碼.如果你需要比較兩個(gè)結(jié)構(gòu),你必涙I!ノ寫(xiě)函數(shù)按壊比較.個(gè)い;?料“K&R2,Sec.G.2p.129];[Rationale.Sec.3.39];[HES,Sec5.6.2p.133].怎樣從/向數(shù)據(jù)文件讀/寫(xiě)結(jié)構(gòu)?H^rite()\ifキ構(gòu)相對(duì)簡(jiǎn)単:fwrite(fisomestruct,sizeofsomestruct,i,tp);rfrr;Mln UI,..:|*< . ? I? ?見(jiàn)十題2.1。和20.3)....i.い構(gòu)包a何指針,則只有指針值會(huì)被寫(xiě)入文件,當(dāng)它打円次讀冋來(lái)的時(shí)候,彼a險(xiǎn)巳後失效破広,為ア泛的移植.你必須用ザ標(biāo)金加卄工件:づ見(jiàn)間則I2.30弗加n更好的方案上寫(xiě)對(duì)樂(lè)數(shù).用可核粒(nffis.至?人爪?)的方式按.立與詁構(gòu).盡む開(kāi)始可能L作市布大.?1?f[HトエSec.15.13p381]我的編徑器在結(jié)構(gòu)u留下ア空洞.這導(dǎo)致空間浪費(fèi)而且無(wú)法與外部致提文件進(jìn)行”ニ走制“讀寫(xiě)C能否關(guān)掉填元.或者控制結(jié)構(gòu)域的對(duì)齊方式?は些”交那寥ザ踴蟋頰滌炳冊(cè)中后面的城的對(duì)市垃也許必必I.J';ff..LJ;lI..1. ■' ,-I. '' 1l.JIM-1「cha!的美里)イ、勝處」點(diǎn)的內(nèi)住:也加,而必3il£2或4或?qū)H大小的倍數(shù),'.I1'. 一擴(kuò)展用I,ゴ“,卜I-f住一樣pragma;-121).。ごセムI小曲的カ法.?見(jiàn)訶,巴20.3,.ヤ.:;M[K<kR2,SecG4p138];[HirS.Sec5.6.4p.135]為什么ヽiz。げ返回的值大于結(jié)構(gòu)的期望值.是不是尾部有填充?為「7仮分加江毎?ヨリ”ー效組トハ峋對(duì)齊,浩構(gòu)可虎口必い述劉川充即使,.,一 ',,[也,F]レ.加,siz,",t,「ソ1iゴ ,いトI訶即2.10久;匕テf[H\S.See.5.67pp139-40]如何詞定域在結(jié)構(gòu)中的字節(jié)僞移?ANSIC<L<stddef.h>中定義j"ofisetofOT,用otfeetof(structs.f)可以計(jì).it結(jié)構(gòu)s中的偏移國(guó)如果出r某種原岡你需要門(mén)丄實(shí)現(xiàn)這個(gè)功屹可以使用下達(dá)這樣的代碼:^defineoffsetof(type,I)((size,)\((char?)&((type*)0)->f-(char*)(type*)0))i<種實(shí)現(xiàn)イ、ー100%的可穢植;發(fā)些編譯器可能會(huì)合法地拒地拉,受’ネ弓、:,[ISO,Sec7.1.6];[Rationale,Sec3.5.42],[HkS.Sec11.1pp292-3]201I年計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言常見(jiàn)問(wèn)題⑶問(wèn)題列表:為什么這樣的代碼:a[i]=i++:不能工作?使用我的編譯器,下面的代碼inti=7;printf("%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國(guó)=i++;我們不知道a口的哪ー個(gè)分量會(huì)被改寫(xiě),但i的確會(huì)增加I,對(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è)。201I年計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言常見(jiàn)問(wèn)題(4)第4章指針問(wèn)題列表:我想聲明-"個(gè)指針并為它分配?些空間,但卻不行。這些代碼有什么問(wèn)題?char*p;*p=malloc(lO);*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ù)externintf(int*):它接受指向int型的指針。我怎樣用引用方式傳入一個(gè)常數(shù)?C有“按引用傳遞”嗎?我看到了用指針調(diào)用函數(shù)的不同語(yǔ)法形式。到底怎么冋事?我怎樣把ー個(gè)int變量轉(zhuǎn)換為char?型?為什么這樣的代碼:;巾]=i++:不能工作?千表達(dá)式耳十有tJ 一七?2改變i的值-bj7在同表達(dá)式的其它心ウセ引用,i4公け政無(wú)定義的"セ無(wú)從カ」:M弓Iリ1(イ邊ギa(chǎn)[i]|').ZIflfn坯是新値(注意,盡智?任K&R中建議這類(lèi)と達(dá)式的行為イ、確定,但C標(biāo)準(zhǔn)卻強(qiáng)烈聲明它上無(wú)定義的,あ見(jiàn)?,網(wǎng)11.32リ匕市朽:[KArRl.Sec2.12];[K^R2,Sec.212];[ISO.Sec.6.3];[H&S,Sec.7.12pp.227-9],使用我的埸譯器.下面的代碼inti=7:printf(i++*i++):返回網(wǎng)?不管按什么順序計(jì)算.奉道不該打印出56嗎?‘,「,じ,」「…11;;++!:1- .一"イ''' .■:,沒(méi)有IHitJ, : .iuK!對(duì)友達(dá)式的其它部分進(jìn)行計(jì)算之前〈即世行,也不能保i止變吊的更新會(huì)在去達(dá)式“完成”(按照ANSIC的術(shù)語(yǔ),在ド個(gè)“Jt列點(diǎn)”之前,ぐ見(jiàn)何題3.7)之加的某個(gè)時(shí)刻逬廳.1例中,編譯器選擇使用變?的舊值相乘以后再對(duì)二十進(jìn)行門(mén)增運(yùn)算.包含多個(gè)不確定的副作用的代碼的行為總是被認(rèn)為未定義.(簡(jiǎn)單而言,“多個(gè)不確定副作用”是指在同一個(gè)表達(dá)式中使用導(dǎo)致同一對(duì)象修改兩次或修改以后又被引用的自增,自減和賦值操作符的任何組合.這是?個(gè)粗略的定義;嚴(yán)格的定義?見(jiàn)問(wèn)題3.7,“未定義”的含義參見(jiàn)問(wèn)題11.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ì)于代碼infi=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部イ、同17+1如果你要使i門(mén)増1,使用i=i+l.i+=l.i++或++i.HiHI仃何組公,夢(mèng)見(jiàn)同感3.10這是個(gè)巧妙的表達(dá)式:a=b=a=b它不需要臨時(shí)變量就可以交換a和b的值。這不具有可移植性?它H圖任序例.巨之間兩次修改變51%而這是無(wú)定義的.例如ぶ人報(bào)と如ド代碼:inta=123,b=7654;在SCO優(yōu)化C編譯將(ice)卜會(huì)把b置為123.把a(bǔ).為0.參見(jiàn)問(wèn)即3.1,3.7和20.14.我可否用括號(hào)來(lái)強(qiáng)制執(zhí)行我所需要的廿算順序??米ー?不行.運(yùn)一苻優(yōu)先級(jí)和括弧只能賦ア衣達(dá)是計(jì)算部分的順序.在處ド的代碼中1()+g()?h()盡管我們知道乘法運(yùn)算在加法之前,仲達(dá)井イ、或迎マスノ、閑數(shù)啷個(gè)會(huì)被首先調(diào)用.如果你后公桶保千な達(dá)人的什6m人你可花而收使用訓(xùn)姉的怖H史,和獨(dú)在的済句.―用耍同:[KkRl.Sec.2.12p.49,SeeA7p];[K&R2,Sec2.12pp.52-3.Sec.A.7p.200.].可是&&和I!運(yùn)算符呢?我看到過(guò)類(lèi)似while((ぐ=getchar())!=EOF&&<!=へ1/)的代碼 這些運(yùn)算符在此處。?個(gè)特蛛的?<知路、例外:如果左邊的づ表達(dá)大決定網(wǎng)絡(luò)I<ノJII和蝕于&亞)則右邊的子我達(dá)式不會(huì)計(jì)算因此,從左至《的計(jì)"可以確保,對(duì)過(guò)號(hào)ぜ州式也是如此.而且,所有這些運(yùn)算符(包括?:)都會(huì)弓へ個(gè)物外的內(nèi)部序例點(diǎn)(參見(jiàn)問(wèn)題3.7).書(shū)號(hào)ー料:[K&R1,Sec.2.6p.38.Sees.A7.11-12pp.190-1];[K&R2,Sec.2.6p.41.Secs.A7.14-15pp.207-8];[ISO,.See6.3.13.Sec.6.3.14.Sec.6.3.15];[H&S,See.7.7pp217-8.Sec.7.8pp.218-20,Sec.7.12.1p.229];[CTicP.Sec.3.7pp.46-7]我怎樣才能理解復(fù)雜表達(dá)式???序列點(diǎn)”是什么?戶(hù)列由及卜時(shí)間點(diǎn)(在第個(gè)表達(dá)式仝部計(jì)リ完や之后或任II、パ卜、?:成,, 1l<I,H' ■_,' 'IANSI/ISOC標(biāo)準(zhǔn)這樣描述:<£!個(gè)和ド個(gè)序列點(diǎn)之間,?個(gè)對(duì)案所保存的值至名只廢被改達(dá)式的計(jì)算修改次而HWカ值只俄用「決定將要保存的值.第一句M比較費(fèi)解.它說(shuō)住個(gè)衣達(dá)式中如果策個(gè)對(duì)象而セ寫(xiě)入,則在同ん達(dá)式中對(duì)該對(duì)女的訪(fǎng)問(wèn)應(yīng)該只局限「れ接用「?計(jì)算將要寫(xiě)入的侑這糸規(guī)則ん詭確保在修改之的オ訪(fǎng)問(wèn)變量的衰達(dá)式為合法,例如i=i+i介ド..;]a[i]=i++Wス1ノ.(,;見(jiàn)リ虺3.1)蓼見(jiàn)ド過(guò)的同題3.&芍ヮ誄科:[ISO,Sec,.Sec.6.3,Sec.6.6.AnnexC];[Rationale.See.2.12.3]:[H1fcs.See712.1pp228-9]那么.對(duì)于a[i]=i++:我們不知道n[]的哪ー個(gè)ガ量會(huì)被改寫(xiě).但i的確會(huì)増加!.對(duì)嗎?イー定[如果個(gè)&達(dá)式和一ー變存未定義,則它的所有方面都會(huì)變成人定義,參見(jiàn)問(wèn)題3.2,3.3,11.32fD11.35.++i和i++有什么區(qū)別?如果你的C諳ri-沒(méi)有說(shuō)明它們的區(qū)別,那么買(mǎi).燈的荷.而二:++iI.1-, 川任用它的我達(dá)式“返冋”新的.増加后的值;而i++對(duì)i增加,但返冋原來(lái)的足本增加的值.如里我不使用表達(dá)式的值.我應(yīng)該用++i或i++來(lái)自增ー個(gè)変量嗎?由r?一兩種格式區(qū)別儀在川成的值,所以在僅使用它"I的副作用時(shí),r±樣.但工.在C++中,前綴方式卻是首選.,?見(jiàn)問(wèn)即3.3.為什么如下的代碼infa=100.I>=100:k”用int<?=a*1>:不能工作?根據(jù)C的內(nèi)部類(lèi)型轉(zhuǎn)換規(guī)則,乘法足用int進(jìn)行的,而其結(jié)果可能在轉(zhuǎn)換為I,“ほ:駅片ム邊的c之前溢出或被破用.可以使用明確的英軍話(huà)拉.強(qiáng)れ乗;丿.以long里進(jìn)行:longintc=(longlnt)a?b;注.?.,(longinり(a*b)不能達(dá)到需要的效果..當(dāng)兩個(gè)整數(shù)做除法一結(jié)?賦リ個(gè)一點(diǎn)變俗」,也行H能白同!(哭璽的何題,解決方法也讓類(lèi)似的’ゝU資料:[K&RLScc.2.7p,41];[KicR2.Sec.2.7p.44].[ISO.Sec];陋S,使用我的編輯器,ド口的代碼];[CT&P,Sec.3.9pp49-50]我需要根據(jù)條件把ー個(gè)復(fù)雜的表達(dá)式賦值給兩個(gè)變量中的ー個(gè)0可以用下邊這樣的代碼嗎?((condition)1!a:b)=conipli-catctLexprobh>n:一、/ .:? ii.iiMfi.in, 也..?:能生成卜“,f伍”.如果你れ的霰要.丨丨!I:I |代碼?((condition)?£a:&b)=compllcated_expresslon;盡管這亳無(wú)憂(yōu)林可£.なサ資料:[ISO.See.63.15];[H&S,Sec.7.1pp.179-180]201I年計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言常見(jiàn)問(wèn)題(4)第4章指針問(wèn)題列表:我想聲明一個(gè)指針并為它分配ー些空間,但卻不行。這些代碼有什么問(wèn)題?char*p;*p=malloc(lO);*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ù)externintf(int*);它接受指向int型的指針。我怎樣用引用方式傳入一個(gè)常數(shù)?C有“按引用傳遞”嗎?我看到了用指針調(diào)用函數(shù)的不同語(yǔ)法形式。到底怎么回事?我怎樣把ー個(gè)int變量轉(zhuǎn)換為char?型?指針我想聲明一個(gè)指針并為它分配ー些空間.但卻不行。這些代碼有什么問(wèn)題?ch;ir*p:*|?=iualloc(10):你一聲明的指針讓p.iiijイ;:Lp,當(dāng)你操作指針本牙時(shí)(例如當(dāng)你對(duì)其M值,使之指向別處時(shí)%你只露要使用指針的名字即可:p=malloc(10);ー你找用指針指向的內(nèi)俘?你4需豊使用?作為間接操作符:?p=H;參ー問(wèn)題!.7,7.1,7.5和8.3.挈ヮ耍セ[CT&P.Sec3.1p28]*p++自增卩還是卩所指向的變量?一:.++,1—打。I' '"ソ11カれ先級(jí)品.因此*p++和?リ,++「ノー3p二冋pi地と血所指向的值,変門(mén)増p指向的值?使用ドp卄+,如果劭作用的川ib無(wú)關(guān)緊変也可以使用++*p,參サ日料:[KArRl.Sec.5.1p.91];[K&R2,Sec5.1p.95];[ISO.Sec.6.3.2.Sec.63.3];[HNS,Sec7.4.4pp.192-3.Sec.7.5p193.Secs.7.57,7.5.8pp199-200].我有一個(gè)char?型指針正巧指向ー些int型變量.我想跳過(guò)它們。為什么如下的代碼((iut*)1>)++:不行?C「山,?」 ". . 1「リ,葉::巴」)?1:時(shí)?整生個(gè)轉(zhuǎn)換按作符.根據(jù)定ス它只倨‘I成トム值(rvalue) 右值氏1-賦值.也不能用/白増(如果編譯霽支持這樣的擴(kuò)展,那要么是個(gè)么足有意作出的科標(biāo)準(zhǔn)擴(kuò)展.)要達(dá)到你的目的可以用:p=(char?)((int*)p+1);或者,因?yàn)閜是char?型.直接用p+=sizeof(int);伸足,在可能的情況ド.你「」1士代せ當(dāng)?shù)闹羔橆?lèi)里,而不足味地成權(quán)李代桃價(jià)Vワ資料[K&R2.Sec.A7.5p.205];[ISO.Sec,6.34];[Rationale,Sec.J[HA:S,Sec.71pp.179-80]我有個(gè)函數(shù).它應(yīng)該接受并初始化一個(gè)指針voidf(int*ip)[staticintdiiininy=5:ip=jcdinniny:}但是當(dāng)我如下調(diào)用時(shí):int*ip:f(ip):調(diào)用者的指針卻沒(méi)有任何變化。?ー函數(shù)初始化的是你希里它初始化 ' -: ?C< .I過(guò)值傳遞的被調(diào)函數(shù)僅僅修改了傳人的指什副本你所要傳入指針的戈'數(shù)變成接受指計(jì)的指針),域お(?圖數(shù)返冋指針.參見(jiàn)問(wèn)題ユ5和17.我能否用void**指針作為參數(shù).使函數(shù)按引用接受一般指針?一叫移司?c中沒(méi)有股的指針的指計(jì)類(lèi)型void?可以用作股指針只;因?yàn)楫?dāng)它和其它類(lèi)型相m除值的時(shí)候,如果而要,它可以ウ動(dòng)轉(zhuǎn)換成其它類(lèi)<;0!イI知自徉的換.所指類(lèi)型為void?之外的類(lèi)型的void*?指包嗎,這個(gè),換下能完成?我有一個(gè)函數(shù)。Xtcciii>tf(hit*):它接受指向int型的指針。我怎樣用引用方式傳入ー個(gè)常數(shù)?下面這樣的調(diào)用f(&5):似乎不行。在C99中.你可以便用,戈公常ST:f((lntD){5B;?i I.' ' ,l(i'Li11.址傳給函數(shù):Intfive=5;f(tfive);參見(jiàn)時(shí)題2.8.丄4Ki20.1C有“按引用傳遞“嗎?真的沒(méi)有.嚴(yán)格地講,c總C按值傳遞,你可以口に口擬按引用傳遞.定義接受指針的俅:數(shù),然后在調(diào)用時(shí)使用&操作符?學(xué)實(shí)I,當(dāng)你同由數(shù)傳入數(shù)組(傳入指ft的情況參見(jiàn)同題6.4及其它)対.潴渾器"麗I就入住糧擬按引用傳遞.但世C沒(méi)有任何I!氏的按引用傳遞或C++的弓用/數(shù)的東西I:.?I?預(yù)處瑪な4以鞏供種“按名稱(chēng)心遞”的形式.?見(jiàn)問(wèn)?84.4和20」.?考資料:[K&R1.Sec.1.8pp.24-5,Sec.5.2pp.91-3]JK&R2,Sec1.8pp27-8.Sec.5.2pp.95-7]:[ISO.Sec.6.322]:[H&S,Sec.9.5pp.273-4]我看到了用指針調(diào)用函數(shù)的不同語(yǔ)法形式°到底怎么回事?最初,個(gè)函效指針心涉用*操作符(和對(duì)額外的括弧)“轉(zhuǎn)換為”?個(gè)”真正的”函數(shù)才能調(diào)用:intr,funcO,(*ip)〇=func;r=(*fp)();ナ函數(shù)總是通過(guò)指針進(jìn)行一用的,! 丁,二’「ー」「 iiful1,I '.It■iin:I .fp函數(shù)名和函數(shù)的指針r=fp();ANSIC標(biāo)沖文師I接受ム山的解fれ達(dá)總J:丨:,. 1允許??見(jiàn)問(wèn)題1.14學(xué)書(shū)?科:[K&Rl.See.5.12p116];[K^R2,See.5.11p120];[ISO,Sec.6.3.2^].[Rationale.Sec.3.3.2J];[H&S,Sec5.8p,147,Sec.74.3p.190]我怎樣把一個(gè)int變量轉(zhuǎn)換為<liar?型?我試了類(lèi)型轉(zhuǎn)換.但是不行。一取決「你希望做什么如果你的類(lèi)型轉(zhuǎn)換不成功,你可能是企圖把整數(shù)轉(zhuǎn)為了符串,這種情況參見(jiàn)問(wèn)題131.S1果你試圖把整數(shù)轉(zhuǎn)換為字符.參見(jiàn)問(wèn)題8.4如果你忒陽(yáng)計(jì)個(gè)指針指向特定的內(nèi)存地址,夢(mèng)見(jiàn)問(wèn)題19.29.201I年計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言常見(jiàn)問(wèn)題(5)第5章空(null)指針問(wèn)題列表:5.!臭名昭著的空指針到底是什么?怎樣在程序里獲得一個(gè)空指針?用縮寫(xiě)的指針比較“if(p)”檢查空指針是否可靠?如果空指針的內(nèi)部表達(dá)不是〇會(huì)怎么樣?NULL是什么,它是怎么定義的?在使用非全零作為空指針內(nèi)部表達(dá)的機(jī)器上,NULL是如何定義的?如果NULL定義成#defineNULL((char*)0)難道不就可以向函數(shù)傳入不加轉(zhuǎn)換的NULL了嗎?如果NULL和〇作為空指針常數(shù)是等價(jià)的,那我到底該用哪ー個(gè)呢?但是如果NULL的值改變了,比如在使用非零內(nèi)部空指針的機(jī)器卜.,難道用NULL(而不是。)不是更好嗎?用預(yù)定義宏#defineNullptr(type)(type*)0幫助創(chuàng)建正確類(lèi)型的空指針。這有點(diǎn)奇怪。NULL可以確保是〇,但空(null)指針卻不一定?為什么有那么多關(guān)于空指針的疑惑?為什么這些問(wèn)題如此經(jīng)常地出現(xiàn)?我很困惑。我就是不能理解這些空指針?類(lèi)的東西??紤]到有關(guān)空指針的所有這些困惑,難道把要求它們內(nèi)部表達(dá)都必須為〇不是更簡(jiǎn)單嗎?說(shuō)真的,真有機(jī)器用非零空指針嗎,或者不同類(lèi)型用不同的表達(dá)?運(yùn)行時(shí)的“空指針賦值”錯(cuò)誤是什么意思?空(null)指針臭名昭著的空指針到底是什么?語(yǔ);,定義中說(shuō)叨,每種指計(jì)類(lèi)里酣有個(gè)特殊值——“空指針”——它。同類(lèi)型的其它所有指針值都不相同,它-與任何對(duì)象或函數(shù)的指針值都不相等“也就足說(shuō)?取地址被作符&永州也不能得到空指針,同H對(duì)maUoc()的成功調(diào)用也イ、會(huì)返問(wèn)空指針,如果失敗,maUoc()的確返冋空指計(jì)」小と::?指針的鼎里用法:衣示“イ、分陀”或者“尚未指向任何地方”的指,匕空指針在極念I(lǐng)不同廣卡初始化的指針空指針可以蝶仟イ;指向任何對(duì)案或? , : I可能指向任何崎、參見(jiàn)問(wèn)題L10、7.1和7.26加卜?文所述,毎種指針一一都有ト空指針,而
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 司機(jī)貨運(yùn)合同范例
- 政府廣告制作合同范例
- 電力供應(yīng)設(shè)備采購(gòu)招標(biāo)合同三篇
- 杉鋸材購(gòu)銷(xiāo)合同范例
- 舞廳服務(wù)合同(2篇)
- 土雞合作養(yǎng)殖合同
- 集體合同協(xié)商函
- 共同建設(shè)用地合同范例
- 安能物流加盟合同范例
- 藥店員工勞動(dòng)合同范例
- 電梯改造維修合同范例
- 2024年醫(yī)院客服中心年終工作總結(jié)范例(3篇)
- 雄安新區(qū)容東片區(qū)地下空間專(zhuān)項(xiàng)規(guī)劃-ECADI
- 自然辯證法論述題146題帶答案(可打印版)
- 2024年急診科護(hù)理計(jì)劃和總結(jié)
- 公司年度培訓(xùn)總結(jié)匯報(bào)
- 電梯日管控、周排查、月調(diào)度內(nèi)容表格
- C語(yǔ)言(2023春)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 《信息技術(shù)改變學(xué)習(xí)》學(xué)歷案
- 2024年抖音投放服務(wù)合同
- 2024年甘肅隴南市高層次人才引進(jìn)474人歷年高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
評(píng)論
0/150
提交評(píng)論