C語(yǔ)言終極面試寶典 C語(yǔ)言面試必備_第1頁(yè)
C語(yǔ)言終極面試寶典 C語(yǔ)言面試必備_第2頁(yè)
C語(yǔ)言終極面試寶典 C語(yǔ)言面試必備_第3頁(yè)
C語(yǔ)言終極面試寶典 C語(yǔ)言面試必備_第4頁(yè)
C語(yǔ)言終極面試寶典 C語(yǔ)言面試必備_第5頁(yè)
已閱讀5頁(yè),還剩79頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第一部分分:基本本概念及及其它問(wèn)問(wèn)答題1、關(guān)鍵鍵字sttatiic的作作用是什什么?這個(gè)簡(jiǎn)單單的問(wèn)題題很少有有人能回回答完全全。在CC語(yǔ)言中中,關(guān)鍵鍵字sttatiic有三三個(gè)明顯顯的作用用:1). 在函數(shù)數(shù)體,一一個(gè)被聲聲明為靜靜態(tài)的變變量在這這一函數(shù)數(shù)被調(diào)用用過(guò)程中中維持其其值不變變。2). 在模塊塊內(nèi)(但但在函數(shù)數(shù)體外),一一個(gè)被聲聲明為靜靜態(tài)的變變量可以以被模塊塊內(nèi)所用用函數(shù)訪訪問(wèn),但但不能被被模塊外外其它函函數(shù)訪問(wèn)問(wèn)。它是是一個(gè)本本地的全全局變量量。3). 在模塊塊內(nèi),一一個(gè)被聲聲明為靜靜態(tài)的函函數(shù)只可可被這一一模塊內(nèi)內(nèi)的其它它函數(shù)調(diào)調(diào)用。那那就是,這這個(gè)函數(shù)數(shù)被限制制在聲明明它的模

2、模塊的本本地范圍圍內(nèi)使用用。大多數(shù)應(yīng)應(yīng)試者能能正確回回答第一一部分,一一部分能能正確回回答第二二部分,同同是很少少的人能能懂得第第三部分分。這是是一個(gè)應(yīng)應(yīng)試者的的嚴(yán)重的的缺點(diǎn),因因?yàn)樗@顯然不懂懂得本地地化數(shù)據(jù)和代碼碼范圍的的好處和和重要性性。2、“引引用”與指針針的區(qū)別別是什么么?答、1) 引用用必須被被初始化化,指針針不必。2) 引引用初始始化以后后不能被被改變,指指針可以以改變所所指的對(duì)對(duì)象。3) 不不存在指指向空值值的引用用,但是是存在指指向空值值的指針針。指針通過(guò)過(guò)某個(gè)指指針變量量指向一一個(gè)對(duì)象象后,對(duì)對(duì)它所指指向的變變量間接接操作。程序中中使用指指針,程程序的可可讀性差差;而引引用

3、本身身就是目目標(biāo)變量量的別名名,對(duì)引引用的操操作就是是對(duì)目標(biāo)標(biāo)變量的的操作。流操作符符、賦賦值操作作符=的返回回值、拷拷貝構(gòu)造造函數(shù)的的參數(shù)、賦值操操作符=的參數(shù)數(shù)、其它它情況都都推薦使使用引用用3、.hh頭文件件中的iifnddef/deffinee/enndiff 的作作用?答:防止止該頭文文件被重重復(fù)引用用。4、#iinclludee 與#inncluude fiile.h的的區(qū)別?答:前者者是從SStanndarrd LLibrraryy的路徑徑尋找和和引用ffilee.h,而而后者是是從當(dāng)前前工作路路徑搜尋尋并引用用fille.hh。5、描述述實(shí)時(shí)系系統(tǒng)的基基本特性性答:在特特定時(shí)間

4、間內(nèi)完成成特定的的任務(wù),實(shí)實(shí)時(shí)性與與可靠性性。6、全局局變量和和局部變變量在內(nèi)內(nèi)存中是是否有區(qū)區(qū)別?如如果有,是是什么區(qū)區(qū)別?答:全局局變量?jī)?chǔ)儲(chǔ)存在靜靜態(tài)數(shù)據(jù)據(jù)區(qū),局局部變量量在堆棧棧中。7、什么么是平衡衡二叉樹(shù)樹(shù)?答:左右右子樹(shù)都都是平衡衡二叉樹(shù)樹(shù)且左右右子樹(shù)的的深度差差值的絕絕對(duì)值不不大于11。8、堆棧棧溢出一一般是由由什么原原因?qū)е轮碌??答?.沒(méi)有回回收垃圾圾資源 2.層次太太深的遞遞歸調(diào)用用9、冒泡泡排序算算法的時(shí)時(shí)間復(fù)雜雜度是什什么?答:O(n22)10、什什么函數(shù)數(shù)不能聲聲明為虛虛函數(shù)?答:coonsttrucctorr11、隊(duì)隊(duì)列和棧棧有什么么區(qū)別?答:隊(duì)列列先進(jìn)先先出,棧棧后

5、進(jìn)先先出12、不不能做sswittch()的參參數(shù)類(lèi)型型答:swwitcch的參參數(shù)不能能為實(shí)型型。13、局局部變量量能否和和全局變變量重名名?答:能,局局部會(huì)屏屏蔽全局局。要用用全局變變量,需需要使用用:局部變量量可以與與全局變變量同名名,在函函數(shù)內(nèi)引引用這個(gè)個(gè)變量時(shí)時(shí),會(huì)用用到同名名的局部部變量,而而不會(huì)用用到全局局變量。對(duì)于有有些編譯譯器而言言,在同同一個(gè)函函數(shù)內(nèi)可可以定義義多個(gè)同同名的局局部變量量,比如如在兩個(gè)個(gè)循環(huán)體體內(nèi)都定定義一個(gè)個(gè)同名的的局部變變量,而而那個(gè)局局部變量量的作用用域就在在那個(gè)循循環(huán)體內(nèi)內(nèi)14、如如何引用用一個(gè)已已經(jīng)定義義過(guò)的全全局變量量?答、可以以用引用用頭文件件的

6、方式式,也可可以用eexteern關(guān)關(guān)鍵字,如如果用引引用頭文文件方式式來(lái)引用用某個(gè)在在頭文件件中聲明明的全局局變量,假假定你將將那個(gè)變變量寫(xiě)錯(cuò)錯(cuò)了,那那么在編編譯期間間會(huì)報(bào)錯(cuò)錯(cuò),如果果你用eexteern方方式引用用時(shí),假假定你犯犯了同樣樣的錯(cuò)誤誤,那么么在編譯譯期間不不會(huì)報(bào)錯(cuò)錯(cuò),而在在連接期期間報(bào)錯(cuò)錯(cuò)。15、全全局變量量可不可可以定義義在可被被多個(gè).C文件件包含的的頭文件件中?為為什么?答、可以以,在不不同的CC文件中中以sttatiic形式式來(lái)聲明明同名全全局變量量??梢栽诓徊煌腃C文件中中聲明同同名的全全局變量量,前提提是其中中只能有有一個(gè)CC文件中中對(duì)此變變量賦初初值,此此時(shí)連接接

7、不會(huì)出出錯(cuò)。16、語(yǔ)語(yǔ)句foor( ;1 ;)有什么么問(wèn)題?它是什什么意思思?答、和wwhille(11)相同同,無(wú)限限循環(huán)。17、ddowhiile和和whiiledoo有什么么區(qū)別?答、前一一個(gè)循環(huán)環(huán)一遍再再判斷,后后一個(gè)判判斷以后后再循環(huán)環(huán)。18、sstattac 全局變變量、局局部變量量、函數(shù)數(shù)與普通通全局變變量、局局部變量量、函數(shù)數(shù)stattic全全局變量量與普通通的全局局變量有有什么區(qū)區(qū)別?sstattic局局部變量量和普通通局部變變量有什什么區(qū)別別?sttatiic函數(shù)數(shù)與普通通函數(shù)有有什么區(qū)區(qū)別?答、全局局變量(外部變變量)的說(shuō)明明之前再再冠以sstattic 就構(gòu)成成了靜態(tài)態(tài)

8、的全局局變量。全局變變量本身身就是靜靜態(tài)存儲(chǔ)儲(chǔ)方式,靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲(chǔ)方式。這兩者在存儲(chǔ)方式上并無(wú)不同。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個(gè)源程序,當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),非靜態(tài)的全局變量在各個(gè)源文件中都是有效的。而靜態(tài)全局變量則限制了其作用域,即只在定義該變量的源文件內(nèi)有效,在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個(gè)源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用,因此可以避免在其它源文件中引起錯(cuò)誤。從以上分分析可以以看出,把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使

9、用范圍。stattic函函數(shù)與普普通函數(shù)數(shù)作用域域不同。僅在本本文件。只在當(dāng)當(dāng)前源文文件中使使用的函函數(shù)應(yīng)該該說(shuō)明為為內(nèi)部函函數(shù)(sstattic),內(nèi)部部函數(shù)應(yīng)應(yīng)該在當(dāng)當(dāng)前源文文件中說(shuō)說(shuō)明和定定義。對(duì)對(duì)于可在在當(dāng)前源源文件以以外使用用的函數(shù)數(shù),應(yīng)該該在一個(gè)個(gè)頭文件件中說(shuō)明明,要使使用這些些函數(shù)的的源文件件要包含含這個(gè)頭頭文件stattic全全局變量量與普通通的全局局變量有有什么區(qū)區(qū)別:sstattic全全局變量量只初使使化一次次,防止止在其他他文件單單元中被被引用;stattic局局部變量量和普通通局部變變量有什什么區(qū)別別:sttatiic局部部變量只只被初始始化一次次,下一一次依據(jù)據(jù)上一次

10、次結(jié)果值值;stattic函函數(shù)與普普通函數(shù)數(shù)有什么么區(qū)別:staaticc函數(shù)在在內(nèi)存中中只有一一份,普普通函數(shù)數(shù)在每個(gè)個(gè)被調(diào)用用中維持持一份拷拷貝19、程程序的內(nèi)內(nèi)存分配配答:一一個(gè)由cc/C+編譯譯的程序序占用的的內(nèi)存分分為以下下幾個(gè)部部分1、棧區(qū)區(qū)(sttackk)由編譯譯器自動(dòng)動(dòng)分配釋釋放,存存放函數(shù)數(shù)的參數(shù)數(shù)值,局局部變量量的值等等。其操操作方式式類(lèi)似于于數(shù)據(jù)結(jié)結(jié)構(gòu)中的的棧。22、堆區(qū)區(qū)(heeap)一般由由程序員員分配釋釋放,若若程序員員不釋放放,程序序結(jié)束時(shí)時(shí)可能由由OS回收收。注意意它與數(shù)數(shù)據(jù)結(jié)構(gòu)構(gòu)中的堆堆是兩回回事,分分配方式式倒是類(lèi)類(lèi)似于鏈鏈表,呵呵呵。33、全局局區(qū)(靜

11、靜態(tài)區(qū))(static)全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束后由系統(tǒng)釋放。4、文字常量區(qū)常量字符串就是放在這里的。程序結(jié)束后由系統(tǒng)釋放。5、程序代碼區(qū)存放函數(shù)體的二進(jìn)制代碼例子程序序這是一一個(gè)前輩輩寫(xiě)的,非非常詳細(xì)細(xì)/mmainn.cppp intt a=0; /全全局初始始化區(qū) chhar *p11; /全局未未初始化化區(qū) maiin() inttb;棧棧 chaar ss=abbc; /棧棧 chaar *p2; /棧棧 chaar *p3=12234556; /112344560在常

12、常量區(qū),pp3在棧棧上。 sstattic intt c=0; /全局局(靜態(tài)態(tài))初始始化區(qū) pp1 = (ccharr*)mmallloc(10); p22 = (chhar*)maallooc(220); /分分配得來(lái)來(lái)得100和200字節(jié)的的區(qū)域就就在堆區(qū)區(qū)。 sttrcppy(pp1,12334566); /112344560放在在常量區(qū)區(qū),編譯譯器可能能會(huì)將它它與p33所向12334566優(yōu)化化成一個(gè)個(gè)地方。20、解解釋堆和和棧的區(qū)區(qū)別答:堆(hheapp)和棧棧(sttackk)的區(qū)區(qū)別(1)申申請(qǐng)方式式staack:由系統(tǒng)統(tǒng)自動(dòng)分分配。例例如,聲聲明在函函數(shù)中一一個(gè)局部部變量ii

13、nt b;系系統(tǒng)自動(dòng)動(dòng)在棧中中為b開(kāi)開(kāi)辟空間間heaap:需需要程序序員自己己申請(qǐng),并并指明大大小,在在c中mmallloc函函數(shù)如pp1=(chaar*)malllocc(100);在在C+中用nnew運(yùn)運(yùn)算符如如p2=(chhar*)maallooc(110);但是注注意p11、p22本身是是在棧中中的。(2)申申請(qǐng)后系系統(tǒng)的響響應(yīng)棧:只要棧棧的剩余余空間大大于所申申請(qǐng)空間間,系統(tǒng)統(tǒng)將為程程序提供供內(nèi)存,否否則將報(bào)報(bào)異常提提示棧溢溢出。堆堆:首先先應(yīng)該知知道操作作系統(tǒng)有有一個(gè)記記錄空閑閑內(nèi)存地地址的鏈鏈表,當(dāng)當(dāng)系統(tǒng)收收到程序序的申請(qǐng)請(qǐng)時(shí),會(huì)會(huì)遍歷該該鏈表,尋尋找第一一個(gè)空間間大于所所申請(qǐng)空

14、空間的堆堆結(jié)點(diǎn),然然后將該該結(jié)點(diǎn)從從空閑結(jié)結(jié)點(diǎn)鏈表表中刪除除,并將將該結(jié)點(diǎn)點(diǎn)的空間間分配給給程序,另另外,對(duì)對(duì)于大多多數(shù)系統(tǒng)統(tǒng),會(huì)在在這塊內(nèi)內(nèi)存空間間中的首首地址處處記錄本本次分配配的大小小,這樣樣,代碼碼中的ddeleete語(yǔ)語(yǔ)句才能能正確的的釋放本本內(nèi)存空空間。另另外,由由于找到到的堆結(jié)結(jié)點(diǎn)的大大小不一一定正好好等于申申請(qǐng)的大大小,系系統(tǒng)會(huì)自自動(dòng)的將將多余的的那部分分重新放放入空閑閑鏈表中中。(3)申申請(qǐng)大小小的限制制棧:在在Winndowws下,棧是向向低地址址擴(kuò)展的的數(shù)據(jù)結(jié)結(jié)構(gòu),是是一塊連連續(xù)的內(nèi)內(nèi)存的區(qū)區(qū)域。這這句話的的意思是是棧頂?shù)牡牡刂泛秃蜅5淖钭畲笕萘苛渴窍到y(tǒng)統(tǒng)預(yù)先規(guī)規(guī)定好的的

15、,在WWINDDOWSS下,棧棧的大小小是2MM(也有有的說(shuō)是是1M,總總之是一一個(gè)編譯譯時(shí)就確確定的常常數(shù)),如如果申請(qǐng)請(qǐng)的空間間超過(guò)棧棧的剩余余空間時(shí)時(shí),將提提示ovverffloww。因此此,能從從棧獲得得的空間間較小。堆:堆堆是向高高地址擴(kuò)擴(kuò)展的數(shù)數(shù)據(jù)結(jié)構(gòu)構(gòu),是不不連續(xù)的的內(nèi)存區(qū)區(qū)域。這這是由于于系統(tǒng)是是用鏈表表來(lái)存儲(chǔ)儲(chǔ)的空閑閑內(nèi)存地地址的,自自然是不不連續(xù)的的,而鏈鏈表的遍遍歷方向向是由低低地址向向高地址址。堆的的大小受受限于計(jì)計(jì)算機(jī)系系統(tǒng)中有有效的虛虛擬內(nèi)存存。由此此可見(jiàn),堆堆獲得的的空間比比較靈活活,也比比較大。(4)申申請(qǐng)效率率的比較較:棧:由系統(tǒng)統(tǒng)自動(dòng)分分配,速速度較快快。但

16、程程序員是是無(wú)法控控制的。堆:是是由neew分配配的內(nèi)存存,一般般速度比比較慢,而而且容易易產(chǎn)生內(nèi)內(nèi)存碎片片,不過(guò)過(guò)用起來(lái)來(lái)最方便便.另外外,在WWINDDOWSS下,最最好的方方式是用用Virrtuaal AAllooc分配配內(nèi)存,他他不是在在堆,也也不是在在棧,而而是直接接在進(jìn)程程的地址址空間中中保留一一塊內(nèi)存存,雖然然用起來(lái)來(lái)最不方方便。但但是速度度快,也也最靈活活。(5)堆堆和棧中中的存儲(chǔ)儲(chǔ)內(nèi)容棧棧:在函函數(shù)調(diào)用用時(shí),第第一個(gè)進(jìn)進(jìn)棧的是是主函數(shù)數(shù)中后的的下一條條指令(函函數(shù)調(diào)用用語(yǔ)句的的下一條條可執(zhí)行行語(yǔ)句)的的地址,然然后是函函數(shù)的各各個(gè)參數(shù)數(shù),在大大多數(shù)的的C編譯譯器中,參參數(shù)是由

17、由右往左左入棧的的,然后后是函數(shù)數(shù)中的局局部變量量。注意意靜態(tài)變變量是不不入棧的的。當(dāng)本本次函數(shù)數(shù)調(diào)用結(jié)結(jié)束后,局局部變量量先出棧棧,然后后是參數(shù)數(shù),最后后棧頂指指針指向向最開(kāi)始始存的地地址,也也就是主主函數(shù)中中的下一一條指令令,程序序由該點(diǎn)點(diǎn)繼續(xù)運(yùn)運(yùn)行。堆堆:一般般是在堆堆的頭部部用一個(gè)個(gè)字節(jié)存存放堆的的大小。堆中的的具體內(nèi)內(nèi)容由程程序員安安排。(6)存存取效率率的比較較charr s11=aaaaaaaaaaaaaaaaaaaa;chaar *s2=bbbbbbbbbbbbbbbbbbbbbbb;aaaaaaaaaaaaaaa是在在運(yùn)行時(shí)時(shí)刻賦值值的;而而bbbbbbbbbbbbbb是是在

18、編譯譯時(shí)就確確定的;但是,在在以后的的存取中中,在棧棧上的數(shù)數(shù)組比指指針?biāo)钢赶虻淖肿址?例如堆堆)快。比如:#inncluudevvoiddmaiin()chaar aa=1;chaar cc=1223455678890;chhar *p=1223455678890;a = cc1;a = pp1;reeturrn;對(duì)應(yīng)的的匯編代代碼100:a=c11;000400106678AA4DFF1moovcll,byytepptrebpp-0FFh0004001066A8884DFFCmoovbyytepptrebpp-4,cll11:a=pp1;000401106DD8B555ECCmovve

19、dxx,dwworddptrrebbp-114h004401007088A42201mmovaal,bbyteeptrreddx+110004011073388445FCCmovvbyttepttreebp-4,al第第一種在在讀取時(shí)時(shí)直接就就把字符符串中的的元素讀讀到寄存存器cll中,而而第二種種則要先先把指針針值讀到到edxx中,在在根據(jù)eedx讀讀取字符符,顯然然慢了。21、什什么是預(yù)預(yù)編譯,何時(shí)需需要預(yù)編編譯?答:預(yù)編編譯又稱(chēng)稱(chēng)為預(yù)處處理,是是做些代代碼文本本的替換換工作。處理#開(kāi)頭的的指令,比如拷拷貝#iinclludee包含的的文件代代碼,#deffinee宏定義義的替換換,條件件

20、編譯等等,就是是為編譯譯做的預(yù)預(yù)備工作作的階段段,主要要處理#開(kāi)始的的預(yù)編譯譯指令,預(yù)預(yù)編譯指指令指示示了在程程序正式式編譯前前就由編編譯器進(jìn)進(jìn)行的操操作,可可以放在在程序中中的任何何位置。c編譯系系統(tǒng)在對(duì)對(duì)程序進(jìn)進(jìn)行通常常的編譯譯之前,先先進(jìn)行預(yù)預(yù)處理。c提供供的預(yù)處處理功能能主要有有以下三三種:11)宏定定義22)文件件包含3)條條件編譯譯總是使用用不經(jīng)常常改動(dòng)的的大型代代碼體。、程序序由多個(gè)個(gè)模塊組組成,所所有模塊塊都使用用一組標(biāo)標(biāo)準(zhǔn)的包包含文件件和相同同的編譯譯選項(xiàng)。在這種種情況下下,可以以將所有有包含文文件預(yù)編編譯為一一個(gè)預(yù)編編譯頭。22、關(guān)關(guān)鍵字cconsst是什什么含意意?答:我

21、只只要一聽(tīng)聽(tīng)到被面面試者說(shuō)說(shuō):“cconsst意味味著常數(shù)數(shù)”,我我就知道道我正在在和一個(gè)個(gè)業(yè)余者者打交道道。去年年Dann Saaks已已經(jīng)在他他的文章章里完全全概括了了connst的的所有用用法,因因此ESSP(譯譯者:EEmbeeddeed SSysttemss Prrogrrammmingg)的每每一位讀讀者應(yīng)該該非常熟熟悉coonstt能做什什么和不不能做什什么.如如果你從從沒(méi)有讀讀到那篇篇文章,只只要能說(shuō)說(shuō)出coonstt意味著著“只讀讀”就可可以了。盡管這這個(gè)答案案不是完完全的答答案,但但我接受受它作為為一個(gè)正正確的答答案。(如如果你想想知道更更詳細(xì)的的答案,仔仔細(xì)讀一一下Saa

22、ks的的文章吧吧。)如如果應(yīng)試試者能正正確回答答這個(gè)問(wèn)問(wèn)題,我我將問(wèn)他他一個(gè)附附加的問(wèn)問(wèn)題:下下面的聲聲明都是是什么意意思?consst iint a;int connst a;consst iint *a;int * cconsst aa;int connst * aa coonstt;前兩個(gè)的的作用是是一樣,aa是一個(gè)個(gè)常整型型數(shù)。第第三個(gè)意意味著aa是一個(gè)個(gè)指向常常整型數(shù)數(shù)的指針針(也就就是,整整型數(shù)是是不可修修改的,但但指針可可以)。第四個(gè)個(gè)意思aa是一個(gè)個(gè)指向整整型數(shù)的的常指針針(也就就是說(shuō),指指針指向向的整型型數(shù)是可可以修改改的,但但指針是是不可修修改的)。最后一一個(gè)意味味著a是是

23、一個(gè)指指向常整整型數(shù)的的常指針針(也就就是說(shuō),指指針指向向的整型型數(shù)是不不可修改改的,同同時(shí)指針針也是不不可修改改的)。如果應(yīng)應(yīng)試者能能正確回回答這些些問(wèn)題,那那么他就就給我留留下了一一個(gè)好印印象。順順帶提一一句,也也許你可可能會(huì)問(wèn)問(wèn),即使使不用關(guān)關(guān)鍵字 connst,也也還是能能很容易易寫(xiě)出功功能正確確的程序序,那么么我為什什么還要要如此看看重關(guān)鍵鍵字coonstt呢?我我也如下下的幾下下理由:1). 關(guān)鍵字字connst的的作用是是為給讀讀你代碼碼的人傳傳達(dá)非常常有用的的信息,實(shí)實(shí)際上,聲聲明一個(gè)個(gè)參數(shù)為為常量是是為了告告訴了用用戶(hù)這個(gè)個(gè)參數(shù)的的應(yīng)用目目的。如如果你曾曾花很多多時(shí)間清清理其

24、它它人留下下的垃圾圾,你就就會(huì)很快快學(xué)會(huì)感感謝這點(diǎn)點(diǎn)多余的的信息。(當(dāng)然然,懂得得用coonstt的程序序員很少少會(huì)留下下的垃圾圾讓別人人來(lái)清理理的。)2). 通過(guò)給給優(yōu)化器器一些附附加的信信息,使使用關(guān)鍵鍵字coonstt也許能能產(chǎn)生更更緊湊的的代碼。3). 合理地地使用關(guān)關(guān)鍵字cconsst可以以使編譯譯器很自自然地保保護(hù)那些些不希望望被改變變的參數(shù)數(shù),防止止其被無(wú)無(wú)意的代代碼修改改。簡(jiǎn)而而言之,這這樣可以以減少bbug的的出現(xiàn)23、關(guān)關(guān)鍵字vvolaatille有什什么含意意 并給給出三個(gè)個(gè)不同的的例子。答:一個(gè)個(gè)定義為為vollatiile的的變量是是說(shuō)這變變量可能能會(huì)被意意想不到到地

25、改變變,這樣樣,編譯譯器就不不會(huì)去假假設(shè)這個(gè)個(gè)變量的的值了。精確地地說(shuō)就是是,優(yōu)化化器在用用到這個(gè)個(gè)變量時(shí)時(shí)必須每每次都小小心地重重新讀取取這個(gè)變變量的值值,而不不是使用用保存在在寄存器器里的備備份。下下面是vvolaatille變量量的幾個(gè)個(gè)例子:1). 并行設(shè)設(shè)備的硬硬件寄存存器(如如:狀態(tài)態(tài)寄存器器)2). 一個(gè)中中斷服務(wù)務(wù)子程序序中會(huì)訪訪問(wèn)到的的非自動(dòng)動(dòng)變量(Nonn-auutommatiic vvariiablles)3). 多線程程應(yīng)用中中被幾個(gè)個(gè)任務(wù)共共享的變變量回答不出出這個(gè)問(wèn)問(wèn)題的人人是不會(huì)會(huì)被雇傭傭的。我我認(rèn)為這這是區(qū)分分C程序序員和嵌嵌入式系系統(tǒng)程序序員的最最基本的的問(wèn)題

26、。嵌入式式系統(tǒng)程程序員經(jīng)經(jīng)常同硬硬件、中中斷、RRTOSS等等打打交道,所所用這些些都要求求vollatiile變變量。不不懂得vvolaatille內(nèi)容容將會(huì)帶帶來(lái)災(zāi)難難。假設(shè)被面面試者正正確地回回答了這這是問(wèn)題題(嗯,懷懷疑這否否會(huì)是這這樣),我我將稍微微深究一一下,看看一下這這家伙是是不是直直正懂得得vollatiile完完全的重重要性。1). 一個(gè)參參數(shù)既可可以是cconsst還可可以是vvolaatille嗎?解釋為為什么。2). 一個(gè)指指針可以以是voolattilee 嗎?解釋為為什么。3). 下面的的函數(shù)有有什么錯(cuò)錯(cuò)誤:int squuaree(voolattilee innt

27、 *ptrr)retuurn *pttr * *pptr;下面是答答案:1). 是的。一個(gè)例例子是只只讀的狀狀態(tài)寄存存器。它它是voolattilee因?yàn)樗赡鼙槐灰庀氩徊坏降馗母淖儭K莄oonstt因?yàn)槌坛绦虿粦?yīng)應(yīng)該試圖圖去修改改它。2). 是的。盡管這這并不很很常見(jiàn)。一個(gè)例例子是當(dāng)當(dāng)一個(gè)中中服務(wù)子子程序修修該一個(gè)個(gè)指向一一個(gè)buuffeer的指指針時(shí)。3). 這段代代碼的有有個(gè)惡作作劇。這這段代碼碼的目的的是用來(lái)來(lái)返指針針*pttr指向向值的平平方,但但是,由由于*pptr指指向一個(gè)個(gè)vollatiile型型參數(shù),編編譯器將將產(chǎn)生類(lèi)類(lèi)似下面面的代碼碼:int squuaree(voo

28、lattilee innt *ptrr)int a,bb;a = *pttr;b = *pttr;retuurn a * b;由于*pptr的的值可能能被意想想不到地地該變,因因此a和和b可能能是不同同的。結(jié)結(jié)果,這這段代碼碼可能返返不是你你所期望望的平方方值!正正確的代代碼如下下:longg sqquarre(vvolaatille iint *pttr)int a;a = *pttr;retuurn a * a;24、三三種基本本的數(shù)據(jù)據(jù)模型答:按照照數(shù)據(jù)結(jié)結(jié)構(gòu)類(lèi)型型的不同同,將數(shù)數(shù)據(jù)模型型劃分為為層次模模型、網(wǎng)網(wǎng)狀模型型和關(guān)系系模型。25、結(jié)結(jié)構(gòu)與聯(lián)聯(lián)合有和和區(qū)別?答:(11). 結(jié)構(gòu)和

29、和聯(lián)合都都是由多多個(gè)不同同的數(shù)據(jù)據(jù)類(lèi)型成成員組成成, 但但在任何何同一時(shí)時(shí)刻, 聯(lián)合中中只存放放了一個(gè)個(gè)被選中中的成員員(所有有成員共共用一塊塊地址空空間), 而結(jié)結(jié)構(gòu)的所所有成員員都存在在(不同同成員的的存放地地址不同同)。(22). 對(duì)于聯(lián)聯(lián)合的不不同成員員賦值, 將會(huì)會(huì)對(duì)其它它成員重重寫(xiě),原來(lái)成成員的值值就不存存在了, 而對(duì)對(duì)于結(jié)構(gòu)構(gòu)的不同同成員賦賦值是互互不影響響的26、描描述內(nèi)存存分配方方式以及及它們的的區(qū)別?答:1) 從靜態(tài)存儲(chǔ)區(qū)域分配。內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。例如全局變量,static 變量。2) 在棧上創(chuàng)建。在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部

30、變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集。3) 從堆上分配,亦稱(chēng)動(dòng)態(tài)內(nèi)存分配。程序在運(yùn)行的時(shí)候用malloc 或new 申請(qǐng)任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時(shí)用free 或delete 釋放內(nèi)存。動(dòng)態(tài)內(nèi)存的生存期由程序員決定,使用非常靈活,但問(wèn)題也最多27、請(qǐng)請(qǐng)說(shuō)出cconsst與#deffinee 相比比,有何何優(yōu)點(diǎn)?答:Coonstt作用:定義常常量、修修飾函數(shù)數(shù)參數(shù)、修飾函函數(shù)返回回值三個(gè)個(gè)作用。被Coonstt修飾的的東西都都受到強(qiáng)強(qiáng)制保護(hù)護(hù),可以以預(yù)防意意外的變變動(dòng),能能提高程程序的健健壯性。1) cconsst 常常

31、量有數(shù)數(shù)據(jù)類(lèi)型型,而宏宏常量沒(méi)沒(méi)有數(shù)據(jù)據(jù)類(lèi)型。編譯器器可以對(duì)對(duì)前者進(jìn)進(jìn)行類(lèi)型型安全檢檢查。而而對(duì)后者者只進(jìn)行行字符替替換,沒(méi)沒(méi)有類(lèi)型型安全檢檢查,并并且在字字符替換換可能會(huì)會(huì)產(chǎn)生意意料不到到的錯(cuò)誤誤。 2) 有些集集成化的的調(diào)試工工具可以以對(duì)coonstt 常量量進(jìn)行調(diào)調(diào)試,但但是不能能對(duì)宏常常量進(jìn)行行調(diào)試。28、簡(jiǎn)簡(jiǎn)述數(shù)組組與指針針的區(qū)別別?答:數(shù)組組要么在在靜態(tài)存存儲(chǔ)區(qū)被被創(chuàng)建(如如全局?jǐn)?shù)數(shù)組),要要么在棧棧上被創(chuàng)創(chuàng)建。指指針可以以隨時(shí)指指向任意意類(lèi)型的的內(nèi)存塊塊。 (1)修修改內(nèi)容容上的差差別 chhar a = “heelloo”; aa0 = X; chhar *p = “wworl

32、ld”; / 注意意p 指指向常量量字符串串 p00 = XX; / 編譯器器不能發(fā)發(fā)現(xiàn)該錯(cuò)錯(cuò)誤,運(yùn)運(yùn)行時(shí)錯(cuò)錯(cuò)誤 (22) 用用運(yùn)算符符sizzeoff 可以以計(jì)算出出數(shù)組的的容量(字字節(jié)數(shù))。sizzeoff(p),p 為指針針得到的的是一個(gè)個(gè) 指針針變量的的字節(jié)數(shù)數(shù),而不不是p 所指的的內(nèi)存容容量。CC+/C 語(yǔ)語(yǔ)言沒(méi)有有辦法知知道指針針?biāo)傅牡膬?nèi)存容容量,除除非在申申請(qǐng)內(nèi)存存時(shí)記住住它。注注意當(dāng)數(shù)數(shù)組作為為函數(shù)的的參數(shù)進(jìn)進(jìn)行傳遞遞時(shí),該該數(shù)組自自動(dòng)退化化為同類(lèi)類(lèi)型的指指針。 chhar a = heelloo woorldd; chhar *p = aa; couut siizeoof(

33、aa) eendll; / 112 字字節(jié) couut siizeoof(pp) eendll; / 44 字節(jié)節(jié) 計(jì)計(jì)算數(shù)組組和指針針的內(nèi)存存容量 vooid Funnc(ccharr a1000) ccoutt sizzeoff(a) enndl; / 4 字節(jié)而而不是1100 字節(jié) 29、分分別寫(xiě)出出BOOOL,iint,flooat,指針類(lèi)類(lèi)型的變變量a 與“零零”的比比較語(yǔ)句句。答:BOOOL : iif ( !aa ) or if(a)iint : if ( aa = 0)flooat :coonstt EXXPREESSIION EXPP = 0.00000001 if ( aa

34、 -EEXP)poiinteer : iff ( a != NNULLL) oor iif(aa = NUULL) 30、如如何判斷斷一段程程序是由由C 編編譯程序序還是由由C+編譯程程序編譯譯的?答:#iifdeef _cpplusspluuscooutcc+;#eelseecouutc;#eendiif31、論論述含參參數(shù)的宏宏與函數(shù)數(shù)的優(yōu)缺缺點(diǎn)答: 帶參宏宏 函數(shù)數(shù)處理時(shí)間間 編譯譯時(shí) 程序運(yùn)運(yùn)行時(shí)參數(shù)類(lèi)型型 沒(méi)有參參數(shù)類(lèi)型型問(wèn)題 定定義實(shí)參參、形參參類(lèi)型處理過(guò)程程 不分配配內(nèi)存 分分配內(nèi)存存程序長(zhǎng)度度 變長(zhǎng) 不不變運(yùn)行速度度 不占運(yùn)運(yùn)行時(shí)間間 調(diào)用用和返回回占用時(shí)時(shí)間32、用用兩個(gè)棧棧

35、實(shí)現(xiàn)一一個(gè)隊(duì)列列的功能能?要求求給出算算法和思思路!答 、設(shè)設(shè)2個(gè)棧棧為A,B, 一開(kāi)始始均為空空.入隊(duì):將新元素素pussh入棧棧A;出隊(duì):(1)判判斷棧BB是否為為空;(2)如如果不為為空,則則將棧AA中所有有元素依依次poop出并并pussh到棧棧B;(3)將將棧B的的棧頂元元素poop出;這樣實(shí)現(xiàn)現(xiàn)的隊(duì)列列入隊(duì)和和出隊(duì)的的平攤復(fù)復(fù)雜度都都還是OO(1), 比比上面的的幾種方方法要好好33、嵌嵌入式系系統(tǒng)中經(jīng)經(jīng)常要用用到無(wú)限限循環(huán),你你怎么樣樣用C編編寫(xiě)死循循環(huán)呢?答:這個(gè)個(gè)問(wèn)題用用幾個(gè)解解決方案案。我首首選的方方案是:whille(11)一些程序序員更喜喜歡如下下方案:for(;)這個(gè)

36、實(shí)現(xiàn)現(xiàn)方式讓讓我為難難,因?yàn)闉檫@個(gè)語(yǔ)語(yǔ)法沒(méi)有有確切表表達(dá)到底底怎么回回事。如如果一個(gè)個(gè)應(yīng)試者者給出這這個(gè)作為為方案,我我將用這這個(gè)作為為一個(gè)機(jī)機(jī)會(huì)去探探究他們們這樣做做的基本原理理。如果果他們的的基本答答案是:“我被被教著這這樣做,但但從沒(méi)有有想到過(guò)過(guò)為什么么。”這這會(huì)給我我留下一一個(gè)壞印印象。第三個(gè)方方案是用用 gootoLoopp:.gotoo Looop;應(yīng)試者如如給出上上面的方方案,這這說(shuō)明或或者他是是一個(gè)匯匯編語(yǔ)言言程序員員(這也也許是好好事)或或者他是是一個(gè)想想進(jìn)入新新領(lǐng)域的的BASSIC/FORRTRAAN程序序員。34、位位操作(BBit mannipuulattionn) 答

37、: 嵌嵌入式系系統(tǒng)總是是要用戶(hù)戶(hù)對(duì)變量量或寄存存器進(jìn)行行位操作作。給定定一個(gè)整整型變量量a,寫(xiě)寫(xiě)兩段代代碼,第第一個(gè)設(shè)設(shè)置a的的bitt 3,第第二個(gè)清清除a 的biit 33。在以以上兩個(gè)個(gè)操作中中,要保保持其它它位不變變。對(duì)這這個(gè)問(wèn)題題有三種種基本的的反應(yīng)11)不知知道如何何下手。該被面面者從沒(méi)沒(méi)做過(guò)任任何嵌入入式系統(tǒng)統(tǒng)的工作作。2) 用bbit fieeldss。Biit ffiellds是是被扔到到C語(yǔ)言言死角的的東西,它它保證你你的代碼碼在不同同編譯器器之間是是不可移移植的,同同時(shí)也保保證了的的你的代代碼是不不可重用用的。我我最近不不幸看到到 Innfinneonn為其較較復(fù)雜的的通

38、信芯芯片寫(xiě)的的驅(qū)動(dòng)程程序,它它用到了了bitt fiieldds因此此完全對(duì)對(duì)我無(wú)用用,因?yàn)闉槲业木幘幾g器用用其它的的方式來(lái)來(lái)實(shí)現(xiàn)bbit fieeldss的。從從道德講講:永遠(yuǎn)遠(yuǎn)不要讓讓一個(gè)非非嵌入式式的家伙伙粘實(shí)際際硬件的的邊。33) 用用 #ddefiiness 和 bitt maaskss 操作作。這是是一個(gè)有有極高可可移植性性的方法法,是應(yīng)應(yīng)該被用用到的方方法。最最佳的解解決方案案如下:#deefinne BBIT33 (00 x1 3)sstattic intt a;voiid sset_bitt3(vvoidd) a |= BITT3;voiid ccleaar_bbit33(v

39、ooid) a &= BIIT3; 一些些人喜歡歡為設(shè)置置和清除除值而定定義一個(gè)個(gè)掩碼同同時(shí)定義義一些說(shuō)說(shuō)明常數(shù)數(shù),這也也是可以以接受的的。我希希望看到到幾個(gè)要要點(diǎn):說(shuō)說(shuō)明常數(shù)數(shù)、|=和&=操作作。35、訪訪問(wèn)固定定的內(nèi)存存位置(AAcceessiing fixxed memmoryy loocattionns) 答:嵌入入式系統(tǒng)統(tǒng)經(jīng)常具具有要求求程序員員去訪問(wèn)問(wèn)某特定定的內(nèi)存存位置的的特點(diǎn)。在某工工程中,要要求設(shè)置置一絕對(duì)對(duì)地址為為0 x667a99的整型型變量的的值為00 xaaa66。編譯器器是一個(gè)個(gè)純粹的的ANSSI編譯譯器。寫(xiě)寫(xiě)代碼去去完成這這一任務(wù)務(wù)。這一一問(wèn)題測(cè)測(cè)試你是是否知道道

40、為了訪訪問(wèn)一絕絕對(duì)地址址把一個(gè)個(gè)整型數(shù)數(shù)強(qiáng)制轉(zhuǎn)轉(zhuǎn)換(ttypeecasst)為為一指針針是合法法的。這這一問(wèn)題題的實(shí)現(xiàn)現(xiàn)方式隨隨著個(gè)人人風(fēng)格不不同而不不同。典典型的類(lèi)類(lèi)似代碼碼如下: innt *ptrr; pptr = (intt *)0 x667a99; *ptrr = 0 xaaa666;AA moore obsscurre aapprroacch iis: 一個(gè)較較晦澀的的方法是是: *(innt * coonstt)(00 x677a9) = 0 xaaa555;即使使你的品品味更接接近第二二種方案案,但我我建議你你在面試試時(shí)使用用第一種種方案。36、中中斷(IInteerruupt

41、ss)答: 中中斷是嵌嵌入式系系統(tǒng)中重重要的組組成部分分,這導(dǎo)導(dǎo)致了很很多編譯譯開(kāi)發(fā)商商提供一一種擴(kuò)展展讓標(biāo)標(biāo)準(zhǔn)C支支持中斷斷。具代代表事實(shí)實(shí)是,產(chǎn)產(chǎn)生了一一個(gè)新的的關(guān)鍵字字 _intterrruptt。下面面的代碼碼就使用用了_intterrruptt關(guān)鍵字字去定義義了一個(gè)個(gè)中斷服服務(wù)子程程序(IISR),請(qǐng)?jiān)u評(píng)論一下下這段代代碼的。_iinteerruupt douublee coompuute_areea (douublee raadiuus) dooublle aareaa = PI * rradiius * rradiius; prrinttf(nAAreaa = %f, aarea

42、a); retturnn arrea;這個(gè)函函數(shù)有太太多的錯(cuò)錯(cuò)誤了,以以至讓人人不知從從何說(shuō)起起了:11)ISSR 不不能返回回一個(gè)值值。如果果你不懂懂這個(gè),那那么你不不會(huì)被雇雇用的。2) ISRR 不能能傳遞參參數(shù)。如如果你沒(méi)沒(méi)有看到到這一點(diǎn)點(diǎn),你被被雇用的的機(jī)會(huì)等等同第一一項(xiàng)。33) 在在許多的的處理器器/編譯譯器中,浮浮點(diǎn)一般般都是不不可重入入的。有有些處理理器/編編譯器需需要讓額額處的寄寄存器入入棧,有有些處理理器/編編譯器就就是不允允許在IISR中中做浮點(diǎn)點(diǎn)運(yùn)算。此外,IISR應(yīng)應(yīng)該是短短而有效效率的,在在ISRR中做浮浮點(diǎn)運(yùn)算算是不明明智的。4) 與第三三點(diǎn)一脈脈相承,pprinn

43、tf()經(jīng)常常有重入入和性能能上的問(wèn)問(wèn)題。如如果你丟丟掉了第第三和第第四點(diǎn),我我不會(huì)太太為難你你的。不不用說(shuō),如如果你能能得到后后兩點(diǎn),那那么你的的被雇用用前景越越來(lái)越光光明了。37、動(dòng)動(dòng)態(tài)內(nèi)存存分配(DDynaamicc meemorry aalloocattionn) 答:盡管管不像非非嵌入式式計(jì)算機(jī)機(jī)那么常常見(jiàn),嵌嵌入式系系統(tǒng)還是是有從堆堆(heeap)中中動(dòng)態(tài)分分配內(nèi)存存的過(guò)程程的。那那么嵌入入式系統(tǒng)統(tǒng)中,動(dòng)動(dòng)態(tài)分配配內(nèi)存可可能發(fā)生生的問(wèn)題題是什么么?這里里,我期期望應(yīng)試試者能提提到內(nèi)存存碎片,碎碎片收集集的問(wèn)題題,變量量的持行行時(shí)間等等等。這這個(gè)主題題已經(jīng)在在ESPP雜志中中被廣泛泛

44、地討論論過(guò)了(主主要是 P.JJ. PPlauugerr, 他他的解釋釋遠(yuǎn)遠(yuǎn)超超過(guò)我這這里能提提到的任任何解釋釋?zhuān)谢剡^(guò)過(guò)頭看一一下這些些雜志吧吧!讓?xiě)?yīng)應(yīng)試者進(jìn)進(jìn)入一種種虛假的的安全感感覺(jué)后,我我拿出這這么一個(gè)個(gè)小節(jié)目目:下面面的代碼碼片段的的輸出是是什么,為為什么?chaar *ptrr;iff (ptrr = (chhar *)mmallloc(0) = NUULL) pputss(GGot a nnulll poointter);eelsee puuts(Goot aa vaalidd poointter);這這是一個(gè)個(gè)有趣的的問(wèn)題。最近在在我的一一個(gè)同事事不經(jīng)意意把0值值傳給了了

45、函數(shù)mmallloc,得得到了一一個(gè)合法法的指針針之后,我我才想到到這個(gè)問(wèn)問(wèn)題。這這就是上上面的代代碼,該該代碼的的輸出是是Goot aa vaalidd poointter。我用用這個(gè)來(lái)來(lái)開(kāi)始討討論這樣樣的一問(wèn)問(wèn)題,看看看被面面試者是是否想到到庫(kù)例程程這樣做做是正確確。得到到正確的的答案固固然重要要,但解解決問(wèn)題題的方法法和你做做決定的的基本原原理更重重要些。38、TTypeedeff 答:Tyypeddef 在C語(yǔ)語(yǔ)言中頻頻繁用以以聲明一一個(gè)已經(jīng)經(jīng)存在的的數(shù)據(jù)類(lèi)類(lèi)型的同同義字。也可以以用預(yù)處處理器做做類(lèi)似的的事。例例如,思思考一下下下面的的例子:#deefinne ddPS strruct

46、t s *tyypeddef strructt s * ttPS; 以上兩兩種情況況的意圖圖都是要要定義ddPS 和 ttPS 作為一一個(gè)指向向結(jié)構(gòu)ss指針。哪種方方法更好好呢?(如如果有的的話)為為什么? 這是一一個(gè)非常常微妙的的問(wèn)題,任任何人答答對(duì)這個(gè)個(gè)問(wèn)題(正正當(dāng)?shù)脑颍┦鞘菓?yīng)當(dāng)被被恭喜的的。答案案是:ttypeedeff更好。思考下下面的例例子:ddPS p1,p2;tPSS p33,p44;第一一個(gè)擴(kuò)展展為sttrucct ss * p1, p22; 上上面的代代碼定義義p1為為一個(gè)指指向結(jié)構(gòu)構(gòu)的指,pp2為一一個(gè)實(shí)際際的結(jié)構(gòu)構(gòu),這也也許不是是你想要要的。第第二個(gè)例例子正確確地定義

47、義了p33 和pp4 兩兩個(gè)指針針。39、用用變量aa給出下下面的定定義答:a) 一個(gè)個(gè)整型數(shù)數(shù)(Ann inntegger)b) 一一個(gè)指向向整型數(shù)數(shù)的指針針(A poiinteer tto aan iinteegerr)c) 一一個(gè)指向向指針的的的指針針,它指指向的指指針是指指向一個(gè)個(gè)整型數(shù)數(shù)(A poiinteer tto aa poointter to an inttegeer)d) 一一個(gè)有110個(gè)整整型數(shù)的的數(shù)組(AAn aarraay oof 110 iinteegerrs)e) 一一個(gè)有110個(gè)指指針的數(shù)數(shù)組,該該指針是是指向一一個(gè)整型型數(shù)的(AAn aarraay oof 1

48、10 ppoinnterrs tto iinteegerrs)f) 一一個(gè)指向向有100個(gè)整型型數(shù)數(shù)組組的指針針(A poiinteer tto aan aarraay oof 110 iinteegerrs)g) 一一個(gè)指向向函數(shù)的的指針,該該函數(shù)有有一個(gè)整整型參數(shù)數(shù)并返回回一個(gè)整整型數(shù)(AA poointter to a ffuncctioon tthatt taakess ann inntegger as an arggumeent andd reeturrns an inttegeer)h) 一一個(gè)有110個(gè)指指針的數(shù)數(shù)組,該該指針指指向一個(gè)個(gè)函數(shù),該該函數(shù)有有一個(gè)整整型參數(shù)數(shù)并返回回

49、一個(gè)整整型數(shù)( An arrray of tenn poointterss too fuuncttionns tthatt taake an inttegeerarguumennt aand retturnn ann inntegger )答案是:a) iint a; / An inttegeerb) iint *a; / A poiinteer tto aan iinteegerrc) iint *aa; / AA poointter to a ppoinnterr too ann innteggerd) iint a110; / Ann arrrayy off 100 innteggers

50、se) iint *a10; / AAn aarraay oof 110 ppoinnterrs tto iinteegerrsf) iint (*aa)110; / A poiinteer tto aan aarraay oof 110 iinteegerrsg) iint (*aa)(iint); / AA poointter to a ffuncctioon aa thhat takkes an inttegeer aarguumennt aand retturnns aan iinteegerrh) iint (*aa100)(intt); / An arrray of 10 poii

51、nteers to funnctiionss thhat takke aan iinteegerr arrgummentt annd rretuurn an inttegeer40、解解釋局部部變量、全局變變量和靜靜態(tài)變量量的含義義。答:41、寫(xiě)寫(xiě)一個(gè)“標(biāo)標(biāo)準(zhǔn)”宏宏答:交換換兩個(gè)參參數(shù)值的的宏定義義為:. #ddefiine SWAAP(aa,b) (a)=(aa)+(b);(b)=(a)-(bb);(a)=(a)-(bb);輸入兩個(gè)個(gè)參數(shù),輸輸出較小小的一個(gè)個(gè):#ddefiine MINN(A,B) (AA) nnextt,并隨隨后刪除除原neext指指向的節(jié)節(jié)點(diǎn)。第二部分分:程序序代碼評(píng)評(píng)

52、價(jià)或者者找錯(cuò)1、下面面的代碼碼輸出是是什么,為為什么?voiid ffoo(voiid) unnsiggnedd innt aa = 6; intt b = -20; (aa+b 66) ? puuts( 6) : putts(66。原原因是當(dāng)當(dāng)表達(dá)式式中存在在有符號(hào)號(hào)類(lèi)型和和無(wú)符號(hào)號(hào)類(lèi)型時(shí)時(shí)所有的的操作數(shù)數(shù)都自動(dòng)動(dòng)轉(zhuǎn)換為為無(wú)符號(hào)號(hào)類(lèi)型。因此-20變變成了一一個(gè)非常常大的正正整數(shù),所所以該表表達(dá)式計(jì)計(jì)算出的的結(jié)果大大于6。這一點(diǎn)點(diǎn)對(duì)于應(yīng)應(yīng)當(dāng)頻繁繁用到無(wú)無(wú)符號(hào)數(shù)數(shù)據(jù)類(lèi)型型的嵌入入式系統(tǒng)統(tǒng)來(lái)說(shuō)是是豐常重重要的。如果你你答錯(cuò)了了這個(gè)問(wèn)問(wèn)題,你你也就到到了得不不到這份份工作的的邊緣。2、評(píng)評(píng)價(jià)下面面的

53、代碼碼片斷:unssignned intt zeero = 00;unnsiggnedd innt ccomppzerro = 0 xxFFFFF; /*11s commpleemennt oof zzeroo */對(duì)于一一個(gè)innt型不不是166位的處處理器為為說(shuō),上上面的代代碼是不不正確的的。應(yīng)編編寫(xiě)如下下:unnsiggnedd innt ccomppzerro = 00;這一一問(wèn)題真真正能揭揭露出應(yīng)應(yīng)試者是是否懂得得處理器器字長(zhǎng)的的重要性性。在我我的經(jīng)驗(yàn)驗(yàn)里,好好的嵌入入式程序序員非常常準(zhǔn)確地地明白硬硬件的細(xì)細(xì)節(jié)和它它的局限限,然而而PC機(jī)機(jī)程序往往往把硬硬件作為為一個(gè)無(wú)無(wú)法避免免的煩

54、惱惱。3、 CC語(yǔ)言同同意一些些令人震震驚的結(jié)結(jié)構(gòu),下下面的結(jié)結(jié)構(gòu)是合合法的嗎嗎,如果果是它做做些什么么?innt aa = 5, b = 7, c;c = a+bb;這個(gè)個(gè)問(wèn)題將將做為這這個(gè)測(cè)驗(yàn)驗(yàn)的一個(gè)個(gè)愉快的的結(jié)尾。不管你你相不相相信,上上面的例例子是完完全合乎乎語(yǔ)法的的。問(wèn)題題是編譯譯器如何何處理它它?水平平不高的的編譯作作者實(shí)際際上會(huì)爭(zhēng)爭(zhēng)論這個(gè)個(gè)問(wèn)題,根根據(jù)最處處理原則則,編譯譯器應(yīng)當(dāng)當(dāng)能處理理盡可能能所有合合法的用用法。因因此,上上面的代代碼被處處理成:c = a+ + b;因此, 這段段代碼持持行后aa = 6, b = 7, c = 112。如如果你知知道答案案,或猜猜出正確確答

55、案,做做得好。如果你你不知道道答案,我我也不把把這個(gè)當(dāng)當(dāng)作問(wèn)題題。我發(fā)發(fā)現(xiàn)這個(gè)個(gè)問(wèn)題的的最大好好處是這這是一個(gè)個(gè)關(guān)于代代碼編寫(xiě)寫(xiě)風(fēng)格,代代碼的可可讀性,代代碼的可可修改性性的好的的話題。4、設(shè)有有以下說(shuō)說(shuō)明和定定義:typeedeff unnionn llongg i; innt kk5; ccharr c; DDATEE;struuct datta innt ccat; DAATE coww; ddoubble dogg; tooo;DATEE maax;則語(yǔ)句 priintff(%d,sizzeoff(sttrucct ddatee)+ssizeeof(maxx);的執(zhí)行行結(jié)果是是? 答

56、、結(jié)結(jié)果是:52。DATTE是一一個(gè)unnionn, 變變量公用用空間. 里面面最大的的變量類(lèi)類(lèi)型是iint5, 占用用20個(gè)個(gè)字節(jié). 所以以它的大大小是220dataa是一個(gè)個(gè)strructt, 每每個(gè)變量量分開(kāi)占占用空間間. 依依次為iint44 + DATTE200 + douublee8 = 322.所以結(jié)果果是 220 + 322 = 52.當(dāng)然.在某某些166位編輯輯器下, innt可能能是2字字節(jié),那那么結(jié)果果是 iint22 + DATTE100 + douublee8 = 2005、請(qǐng)寫(xiě)寫(xiě)出下列列代碼的的輸出內(nèi)內(nèi)容#inccluddemainn()int a,bb,c,d;a

57、=100;b=a+;c=+a;d=100*a+;prinntf(b,cc,d:%d,%d,%d,bb,c,dd);retuurn 0; 答:100,122,12206、寫(xiě)出出下列代代碼的輸輸出內(nèi)容容#inccluddeint incc(innt aa)retuurn(+aa);int mullti(intt*a,intt*b,intt*c)retuurn(*c=*a*b);typeedeff innt(FFUNCC1)(intt inn);typeedeff innt(FFUNCC2) (innt*,intt*,iint*);voidd shhow(FUNNC2 funn,innt aarg1

58、1, iint*argg2)INCpp=&iinc;int temmp =p(aarg11);fun(&teemp,&arrg1, arrg2);prinntf(%ddn,*aarg22);mainn()int a;showw(muultii,100,&aa);retuurn 0;答:11107、請(qǐng)找找出下面面代碼中中的所以以錯(cuò)誤說(shuō)明:以以下代碼碼是把一一個(gè)字符符串倒序序,如“aabcdd”倒序序后變?yōu)闉椤癲ccba”1、#iinclludeesttrinng.hh2、maain()3、4、 ccharr*srrc=helllo,worrld;5、 ccharr* ddestt=NUULL;6

59、、 iint lenn=sttrleen(ssrc);7、 ddestt=(ccharr*)mmallloc(lenn);8、 ccharr* dd=deest;9、 ccharr* ss=srrcllen;10、 whiile(lenn-!=0) 11、 d+=s-;12、 priintff(%s,desst);13、 retturnn 0;14、答:方法1:int maiin()charr* ssrc = helllo,worrld;int lenn = strrlenn(srrc);charr* ddestt = (chhar*)maallooc(llen+1);/要要為00分配一一個(gè)空

60、間間charr* dd = desst;charr* ss = &srrcllen-1;/指指向最后后一個(gè)字字符whille( lenn- != 0 )*d+=*ss-;*d = 0;/尾尾部要加加0prinntf(%ssn,deest);freee(deest);/ 使用用完,應(yīng)應(yīng)當(dāng)釋放放空間,以以免造成成內(nèi)存匯匯泄露retuurn 0;方法2:#inccludde #inccludde mainn()charr sttr=hhelllo,wworlld;int lenn=sttrleen(sstr);charr t;for(intt i=0; illen/2; i+)t=sttrii; s

溫馨提示

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

評(píng)論

0/150

提交評(píng)論