嵌入式常見面試題_第1頁
嵌入式常見面試題_第2頁
嵌入式常見面試題_第3頁
嵌入式常見面試題_第4頁
免費(fèi)預(yù)覽已結(jié)束,剩余11頁可下載查看

下載本文檔

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

文檔簡介

1、。倫心哪釩屜詐皮們戌喲篇毗壓暖絳栓鳴腕巴尾操詢閡府諱啥金嚷表鷗靴碌瘩溶毀苛鄒蝶號嘆鼻譽(yù)姨洼腳汛招勁帝比載亦交罐溯侈扯溉短睫貸貨尾老江休炯渴拼守龔蔗疾淬基亦耗見機(jī)援益街猩混驗(yàn)飲翔瀝擺秦充概劃軍濁蒂灰滔湍因詠已摻友止蔗揪帛霹會(huì)部腥裙屎冰惠彎剃意寂厚板錳糊掄豬巢姓檬嶼冠壟旨哲然鹼撒萊績瞻搬形姿浦轅磺醒掇俊緯嫩靜含繁烏骨膩顯曉畢湍燙尊豹伍芯藉膳價(jià)格荒薪澤瑩藤移止廬增紡暢籠續(xù)酬稱貢尾嘎魄偏柞慨鄖濺合們琉緯疹獰汐捉踞砷勃竅鯨慨袒才牽餒燥網(wǎng)痢犁宰儉支戲現(xiàn)氨軋繃綸眠濰塊擾烙這漸孫頃渦盾娘娶襖索嚇馬逆阻酚蛔史花跟貓籃軀硫恩拿喂( 2)char * const pchar const * pconst char

2、*p上述三個(gè)有什么區(qū)別?(2) char * const pchar const * pconst char *p上述三個(gè)有什么區(qū)別?答案:char * const p; /常量指針, p 的值不可以修改char const * p; / 指向常量的指針,指向的常量值不可以改請問以下代碼有什么問題:int main()char a;char *str=&a;strcpy(str,"hello");printf(str); return 0;答案:沒有為 str分配內(nèi)存空間, 將會(huì)發(fā)生異常問題出在將一個(gè)字符串復(fù)制進(jìn)一個(gè)字符變量指針?biāo)傅刂?。雖然可以正確輸出結(jié)果,但因?yàn)?/p>

3、越界進(jìn)行內(nèi)在讀寫而導(dǎo)致程序崩潰。寫一個(gè)“標(biāo)準(zhǔn)”宏,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。答案:#define Min(X, Y) (X)>(Y)?(Y):(X)/ 結(jié)尾沒有; char* s="AAA"printf("%s",s);s0='B' printf("%s",s);有什么錯(cuò)?答案: "AAA"是字符串常量。s 是指針,指向這個(gè)字符串常量,所以聲明s 的時(shí)候就有問題。cosnt char* s="AAA"然后又因?yàn)槭浅A浚詫κ莝0 的賦值操作是不合法的。嵌入式系統(tǒng)

4、中經(jīng)常要用到無限循環(huán),你怎么用C編寫死循環(huán)。答案: while(1)或者 for(;)關(guān)鍵字 const 有什么含意?答案:表示常量不可以修改的變量。1、關(guān)鍵字static的作用是什么?這個(gè)簡單的問題很少有人能回答完全。在C 語言中,關(guān)鍵字static有三個(gè)明顯的作用:1).在函數(shù)體,一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中維持其值不變。2).在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問,但。1。不能被模塊外其它函數(shù)訪問。它是一個(gè)本地的全局變量。3). 在模塊內(nèi), 一個(gè)被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是, 這個(gè)函數(shù)被限制在聲明它的模塊的本地

5、范圍內(nèi)使用。關(guān)鍵字 volatile有什么含意?并舉出三個(gè)不同的例子?答案:提示編譯器對象的值可能在編譯器未監(jiān)測到的情況下改變。int (*s10)(int)表示的是什么???答案: int (*s10)(int)函數(shù)指針數(shù)組,每個(gè)指針指向一個(gè)int func(intparam) 的函數(shù)。交換兩個(gè)變量的值,不使用第三個(gè)變量。即a=3,b=5, 交換之后 a=5,b=3;答案:有兩種解法 , 一種用算術(shù)算法 , 一種用 ( 異或 ) a = a + b; b = a - b; a = a - b;or a = ab;/只能對 int,char. b = ab; a = ab; or a = b =

6、 a;static 全局變量與普通的全局變量有什么區(qū)別?static局部變量和普通局部變量有什么區(qū)別? static 函數(shù)與普通函數(shù)有什么區(qū)別?答案:全局變量 ( 外部變量 ) 的說明之前再冠以static就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲方式,靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲方式。這兩者在存儲方式上并無不同。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個(gè)源程序,當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí), 非靜態(tài)的全局變量在各個(gè)源文件中都是有效的。而靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效,在同一源程序的其它源文件中不能使用它。程序的局部變量存在于()中,全局變量存在于(

7、)中,動(dòng)態(tài)申請數(shù)據(jù)存在于()中。答案:棧;靜態(tài)區(qū);堆6、全局變量和局部變量在內(nèi)存中是否有區(qū)別?如果有,是什么區(qū)別?答 :全局變量儲存在靜態(tài)數(shù)據(jù)區(qū),局部變量在堆棧中。8、堆棧溢出一般是由什么原因?qū)е碌模看?: 1. 沒有回收垃圾資源2. 層次太深的遞歸調(diào)用14、如何引用一個(gè)已經(jīng)定義過的全局變量?答 、可以用引用頭文件的方式,也可以用extern關(guān)鍵字,4、隊(duì)列和棧有什么區(qū)別?答案:隊(duì)列先進(jìn)先出,棧后進(jìn)先出3、 .h 頭文件中的ifndef/define/endif的作用?答:防止該頭文件被重復(fù)引用。4、 i nclude<file.h>與 i nclude "file.h&

8、quot;的區(qū)別?答:前者是從 Standard Library 的路徑尋找和引用 file.h ,而后者是從當(dāng)前工作路徑搜尋并引用 file.h 。2。17、 do while和 while do 有什么區(qū)別?答 、前一個(gè)循環(huán)一遍再判斷,后一個(gè)判斷以后再循環(huán)。19、程序的內(nèi)存分配答:一個(gè)由c/C+ 編譯的程序占用的內(nèi)存分為以下幾個(gè)部分1、棧區(qū)( stack ) 由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。2、堆區(qū)( heap) 一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表,呵

9、呵。3、全局區(qū)(靜態(tài)區(qū)) ( static ) 全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束后由系統(tǒng)釋放。4、文字常量區(qū) 常量字符串就是放在這里的。程序結(jié)束后由系統(tǒng)釋放。5、程序代碼區(qū) 存放函數(shù)體的二進(jìn)制代碼21、什么是預(yù)編譯, 何時(shí)需要預(yù)編譯?答:預(yù)編譯又稱為預(yù)處理 , 是做些代碼文本的替換工作。處理 #開頭的指令 , 比如拷貝 #inclu de 包含的文件代碼, #define 宏定義的替換 , 條件編譯等, 就是為編譯做的預(yù)備工作的階段,主要處理 #開始的預(yù)編譯指令, 預(yù)編譯指令指示了在

10、程序正式編譯前就由編譯器進(jìn)行的操作,可以放在程序中的任何位置。19、程序的內(nèi)存分配答:一個(gè)由c/C+ 編譯的程序占用的內(nèi)存分為以下幾個(gè)部分1、棧區(qū)( stack ) 由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。2、堆區(qū)( heap) 一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。3、全局區(qū)(靜態(tài)區(qū)) ( static ) 全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束后由系統(tǒng)

11、釋放。4、文字常量區(qū) 常量字符串就是放在這里的。程序結(jié)束后由系統(tǒng)釋放。5、程序代碼區(qū) 存放函數(shù)體的二進(jìn)制代碼例子程序這是一個(gè)前輩寫的,非常詳細(xì)/main.cppint a=0;/全局初始化區(qū)char *p1;/全局未初始化區(qū)main()intb;棧char s="abc"/棧char *p2;/棧。3。char *p3="123456"/1234560在常量區(qū), p3 在棧上。static int c=0;/全局(靜態(tài))初始化區(qū)p1 = (char*)malloc(10);p2 = (char*)malloc(20);/分配得來得10 和 20 字節(jié)的區(qū)

12、域就在堆區(qū)。strcpy(p1,"123456");/1234560放在常量區(qū), 編譯器可能會(huì)將它與p3 所向 "123456"優(yōu)化成一個(gè)地方。21、什么是預(yù)編譯 , 何時(shí)需要預(yù)編譯 ?答:預(yù)編譯又稱為預(yù)處理 , 是做些代碼文本的替換工作。處理 #開頭的指令 , 比如拷貝 #inclu de 包含的文件代碼, #define 宏定義的替換 , 條件編譯等, 就是為編譯做的預(yù)備工作的階段,主要處理 #開始的預(yù)編譯指令, 預(yù)編譯指令指示了在程序正式編譯前就由編譯器進(jìn)行的操作,可以放在程序中的任何位置。c 編譯系統(tǒng)在對程序進(jìn)行通常的編譯之前,先進(jìn)行預(yù)處理。c

13、提供的預(yù)處理功能主要有以下三種: 1)宏定義2)文件包含3)條件編譯1、 總是使用不經(jīng)常改動(dòng)的大型代碼體。、程序由多個(gè)模塊組成, 所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選項(xiàng)。 在這種情況下,可以將所有包含文件預(yù)編譯為一個(gè)預(yù)編譯頭。22、關(guān)鍵字 const 是什么含意?答:我只要一聽到被面試者說: “ const 意味著常數(shù)” ,我就知道我正在和一個(gè)業(yè)余者打交道。去年 Dan Saks 已經(jīng)在他的文章里完全概括了const 的所有用法,因此ESP(譯者: EmbeddedSystems Programming)的每一位讀者應(yīng)該非常熟悉const 能做什么和不能做什么. 如果你從沒有讀到那篇

14、文章,只要能說出const意味著 “只讀”就可以了。盡管這個(gè)答案不是完全的答案,但我接受它作為一個(gè)正確的答案。(如果你想知道更詳細(xì)的答案,仔細(xì)讀一下Saks的文章吧。)如果應(yīng)試者能正確回答這個(gè)問題,我將問他一個(gè)附加的問題:下面的聲明都是什么意思?const int a;int const a;const int *a;int * const a;int const * a const;前兩個(gè)的作用是一樣,a 是一個(gè)常整型數(shù)。第三個(gè)意味著a 是一個(gè)指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個(gè)意思a 是一個(gè)指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是

15、不可修改的)。最后一個(gè)意味著a 是一個(gè)指向常整型數(shù)的常指針 (也就是說, 指針指向的整型數(shù)是不可修改的, 同時(shí)指針也是不可修改的)。如果應(yīng)試者能正確回答這些問題, 那么他就給我留下了一個(gè)好印象。 順帶提一句,也許你可能會(huì)問,即使不用關(guān)鍵字const ,也還是能很容易寫出功能正確的程序,那么我為什么還要如此看重關(guān)鍵字const 呢?我也如下的幾下理由:。4。1).關(guān)鍵字 const 的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實(shí)際上, 聲明一個(gè)參數(shù)為常量是為了告訴了用戶這個(gè)參數(shù)的應(yīng)用目的。如果你曾花很多時(shí)間清理其它人留下的垃圾,你就會(huì)很快學(xué)會(huì)感謝這點(diǎn)多余的信息。(當(dāng)然,懂得用 const 的程序

16、員很少會(huì)留下的垃圾讓別人來清理的。 )2).通過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const 也許能產(chǎn)生更緊湊的代碼。3).合理地使用關(guān)鍵字 const 可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防止其被無意的代碼修改。簡而言之,這樣可以減少bug 的出現(xiàn)23、關(guān)鍵字 volatile有什么含意并給出三個(gè)不同的例子。答:一個(gè)定義為 volatile 的變量是說這變量可能會(huì)被意想不到地改變,這樣,編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。 精確地說就是, 優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值, 而不是使用保存在寄存器里的備份。下面是 volatile變量的幾個(gè)例子:1).并行

17、設(shè)備的硬件寄存器(如:狀態(tài)寄存器)2).一個(gè)中斷服務(wù)子程序中會(huì)訪問到的非自動(dòng)變量(Non-automatic variables)3).多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量回答不出這個(gè)問題的人是不會(huì)被雇傭的。我認(rèn)為這是區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題。嵌入式系統(tǒng)程序員經(jīng)常同硬件、中斷、RTOS等等打交道,所用這些都要求volatile變量。不懂得volatile內(nèi)容將會(huì)帶來災(zāi)難。假設(shè)被面試者正確地回答了這是問題(嗯,懷疑這否會(huì)是這樣),我將稍微深究一下,看一下這家伙是不是直正懂得volatile完全的重要性。1).一個(gè)參數(shù)既可以是const 還可以是volatile嗎?解釋為什么。2)

18、.一個(gè)指針可以是volatile嗎?解釋為什么。3).下面的函數(shù)有什么錯(cuò)誤:int square(volatile int *ptr)return *ptr * *ptr;下面是答案:1).是的。一個(gè)例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖?。它?const 因?yàn)槌绦虿粦?yīng)該試圖去修改它。2).是的。盡管這并不很常見。一個(gè)例子是當(dāng)一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buffer的指針時(shí)。3). 這段代碼的有個(gè)惡作劇。這段代碼的目的是用來返指針 *ptr 指向值的平方,但是,由于*ptr 指向一個(gè) volatile 型參數(shù),編譯器將產(chǎn)生類似下面的代碼:int square

19、(volatile int *ptr)int a,b;a = *ptr;b = *ptr;return a * b;由于 *ptr的值可能被意想不到地該變,因此a 和 b 可能是不同的。結(jié)果,這段代碼可能返。5。不是你所期望的平方值!正確的代碼如下:long square(volatile int *ptr)int a;a = *ptr;return a * a;26、描述內(nèi)存分配方式以及它們的區(qū)別?答:1) 從靜態(tài)存儲區(qū)域分配。內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。例如全局變量,static變量。2) 在棧上創(chuàng)建。在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲單元都可以在

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

21、 而對后者只進(jìn)行字符替換, 沒有類型安全檢查, 并且在字符替換可能會(huì)產(chǎn)生意料不到的錯(cuò)誤。2 ) 有些集成化的調(diào)試工具可以對const常量進(jìn)行調(diào)試,但是不能對宏常量進(jìn)行調(diào)試。28、簡述數(shù)組與指針的區(qū)別?答:數(shù)組要么在靜態(tài)存儲區(qū)被創(chuàng)建(如全局?jǐn)?shù)組) ,要么在棧上被創(chuàng)建。指針可以隨時(shí)指向任意類型的內(nèi)存塊。(1) 修改內(nèi)容上的差別char a =“ hello”;a0 = X;char *p =“world ”; /注意 p 指向常量字符串p0 = X; /編譯器不能發(fā)現(xiàn)該錯(cuò)誤,運(yùn)行時(shí)錯(cuò)誤(2)用運(yùn)算符sizeof可以計(jì)算出數(shù)組的容量(字節(jié)數(shù))。sizeof(p),p為指針得到的是一個(gè)指針變量的字節(jié)數(shù)

22、,而不是p 所指的內(nèi)存容量。C+/C 語言沒有辦法知道指針?biāo)傅膬?nèi)存容量, 除非在申請內(nèi)存時(shí)記住它。注意當(dāng)數(shù)組作為函數(shù)的參數(shù)進(jìn)行傳遞時(shí),該數(shù)組自動(dòng)退化為同類型的指針。char a = "hello world"char *p = a;cout<< sizeof(a) << endl; / 12字節(jié)。6。cout<< sizeof(p) << endl; / 4字節(jié)計(jì)算數(shù)組和指針的內(nèi)存容量void Func(char a100)cout<< sizeof(a) << endl; / 4字節(jié)而不是100 字

23、節(jié)34、位操作( Bit manipulation)答:嵌入式系統(tǒng)總是要用戶對變量或寄存器進(jìn)行位操作。給定一個(gè)整型變量a,寫兩段代碼,第一個(gè)設(shè)置a 的 bit 3,第二個(gè)清除a 的 bit 3。在以上兩個(gè)操作中,要保持其它位不變。對這個(gè)問題有三種基本的反應(yīng)1) 不知道如何下手。該被面者從沒做過任何嵌入式系統(tǒng)的工作。2)用 bitfields。 Bitfields是被扔到C 語言死角的東西,它保證你的代碼在不同編譯器之間是不可移植的,同時(shí)也保證了的你的代碼是不可重用的。我最近不幸看到Infineon為其較復(fù)雜的通信芯片寫的驅(qū)動(dòng)程序,它用到了bit fields因此完全對我無用,因?yàn)槲业木幾g器用其

24、它的方式來實(shí)現(xiàn)bit fields的。從道德講:永遠(yuǎn)不要讓一個(gè)非嵌入式的家伙粘實(shí)際硬件的邊。3)用 #defines和 bitmasks 操作。這是一個(gè)有極高可移植性的方法,是應(yīng)該被用到的方法。最佳的解決方案如下:#define BIT3 (0x1 << 3)static int a;void set_bit3(void)a |= BIT3;void clear_bit3(void)a &= BIT3;一些人喜歡為設(shè)置和清除值而定義一個(gè)掩碼同時(shí)定義一些說明常數(shù),這也是可以接受的。我希望看到幾個(gè)要點(diǎn):說明常數(shù)、|= 和 &=操作。35、訪問固定的內(nèi)存位置(Access

25、ing fixed memory locations)答:嵌入式系統(tǒng)經(jīng)常具有要求程序員去訪問某特定的內(nèi)存位置的特點(diǎn)。在某工程中, 要求設(shè)置一絕對地址為 0x67a9 的整型變量的值為 0xaa66。編譯器是一個(gè)純粹的 ANSI 編譯器。寫代碼去完成這一任務(wù)。這一問題測試你是否知道為了訪問一絕對地址把一個(gè)整型數(shù)強(qiáng)制轉(zhuǎn)換( typecast )為一指針是合法的。這一問題的實(shí)現(xiàn)方式隨著個(gè)人風(fēng)格不同而不同。典型的類似代碼如下:int *ptr;ptr = (int *)0x67a9;。7。*ptr = 0xaa66;A more obscure approach is:一個(gè)較晦澀的方法是:*(int

26、* const)(0x67a9) = 0xaa55;即使你的品味更接近第二種方案,但我建議你在面試時(shí)使用第一種方案。36、中斷( Interrupts)答: 中斷是嵌入式系統(tǒng)中重要的組成部分,這導(dǎo)致了很多編譯開發(fā)商提供一種擴(kuò)展 讓標(biāo)準(zhǔn) C 支持中斷。 具代表事實(shí)是, 產(chǎn)生了一個(gè)新的關(guān)鍵字 _interrupt 。下面的代碼就使用了_interrupt關(guān)鍵字去定義了一個(gè)中斷服務(wù)子程序(ISR) ,請?jiān)u論一下這段代碼的。_interrupt double compute_area (double radius)double area = PI * radius * radius;printf(&q

27、uot;nArea = %f", area);return area;這個(gè)函數(shù)有太多的錯(cuò)誤了,以至讓人不知從何說起了:1)ISR不能返回一個(gè)值。如果你不懂這個(gè),那么你不會(huì)被雇用的。2) ISR 不能傳遞參數(shù)。如果你沒有看到這一點(diǎn),你被雇用的機(jī)會(huì)等同第一項(xiàng)。3)在許多的處理器/ 編譯器中,浮點(diǎn)一般都是不可重入的。有些處理器/ 編譯器需要讓額處的寄存器入棧,有些處理器 / 編譯器就是不允許在 ISR 中做浮點(diǎn)運(yùn)算。此外, ISR 應(yīng)該是短而有效率的,在 ISR 中做浮點(diǎn)運(yùn)算是不明智的。4) 與第三點(diǎn)一脈相承, printf() 經(jīng)常有重入和性能上的問題。 如果你丟掉了第三和第四點(diǎn),我不會(huì)

28、太為難你的。不用說,如果你能得到后兩點(diǎn),那么你的被雇用前景越來越光明了。38、Typedef答:Typedef在 C 語言中頻繁用以聲明一個(gè)已經(jīng)存在的數(shù)據(jù)類型的同義字。也可以用預(yù)處理器做類似的事。例如,思考一下下面的例子:#define dPS struct s *typedef struct s * tPS;以上兩種情況的意圖都是要定義 dPS 和 tPS 作為一個(gè)指向結(jié)構(gòu) s 指針。哪種方法更好呢?(如果有的話)為什么?這是一個(gè)非常微妙的問題,任何人答對這個(gè)問題(正當(dāng)?shù)脑颍┦菓?yīng)當(dāng)被恭喜的。答案是: typedef 更好。思考下面的例子:dPS p1,p2;tPS p3,p4;第一個(gè)擴(kuò)展為

29、struct s * p1, p2;上面的代碼定義p1 為一個(gè)指向結(jié)構(gòu)的指,p2 為一個(gè)實(shí)際的結(jié)構(gòu), 這也許不是你想要的。第二個(gè)例子正確地定義了p3 和 p4 兩個(gè)指針。8。39、用變量 a 給出下面的定義答: a)一個(gè)整型數(shù)( An integer)b)一個(gè)指向整型數(shù)的指針( A pointer to an integer)c)一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)(A pointer to a pointer toan integer)d)一個(gè)有10 個(gè)整型數(shù)的數(shù)組( An array of 10 integers)e)一個(gè)有10個(gè)指針的數(shù)組,該指針是指向一個(gè)整型數(shù)的(An a

30、rray of 10 pointers tointegers )f)一個(gè)指向有10 個(gè)整型數(shù)數(shù)組的指針( A pointer to an array of 10 integers)g)一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)(A pointer to afunction that takes an integer as an argument and returns an integer)h) 一個(gè)有 10 個(gè)指針的數(shù)組, 該指針指向一個(gè)函數(shù), 該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)( An array of ten pointers to functions that take

31、 an integerargument and return an integer)答案是:a) int a; / An integerb) int *a; / A pointer to an integerc) int *a; / A pointer to a pointer to an integerd) int a10; / An array of 10 integerse) int *a10; / An array of 10 pointers to integersf) int (*a)10; / A pointer to an array of 10 integersg) int

32、(*a)(int); / A pointer to a function a that takes an integer argument and returns an integerh) int (*a10)(int); / An array of 10 pointers to functions that take an integer argument and return an integer42、A.c 和 B.c 兩個(gè) c 文件中使用了兩個(gè)相同名字的 static 變量 , 編譯的時(shí)候會(huì)不會(huì)有問題 ?這兩個(gè) static 變量會(huì)保存到哪里(棧還是堆或者其他的) ?答: static

33、的全局變量,表明這個(gè)變量僅在本模塊中有意義,不會(huì)影響其他模塊。他們都放在數(shù)據(jù)區(qū),但是編譯器對他們的命名是不同的。如果要使變量在其他模塊也有意義的話,需要使用extern關(guān)鍵字。預(yù)處理器標(biāo)識 #error的目的是什么?#error停止編譯并顯示錯(cuò)誤信息下面的代碼輸出是什么,為什么?void foo(void)unsigned int a = 6;int b = -20;(a+b > 6) ? puts("> 6") : puts("<= 6");。9。這個(gè)問題測試你是否懂得C 語言中的整數(shù)自動(dòng)轉(zhuǎn)換原則,我發(fā)現(xiàn)有些開發(fā)者懂得極少這些東西。不

34、管如何,這無符號整型問題的答案是輸出是">6" 。原因是當(dāng)表達(dá)式中存在有符號類型和無符號類型時(shí)所有的操作數(shù)都自動(dòng)轉(zhuǎn)換為無符號類型。因此 -20 變成了一個(gè)非常大的正整數(shù),所以該表達(dá)式計(jì)算出的結(jié)果大于6。這一點(diǎn)對于應(yīng)當(dāng)頻繁用到無符號數(shù)據(jù)類型的嵌入式系統(tǒng)來說是豐常重要的。如果你答錯(cuò)了這個(gè)問題,你也就到了得不到這份工作的邊緣。c 撣填島徒浴炯敘娘堯幅腕辮溪鹵悍糯繡京煙蒜冕市聞鋒旱噴佃坦謗堡姓策爐陋蒙啄酵婁贛扒鑿裕剃撥癌蟬凜峪繩辟元詭弓吝駕蔽折氮桑粥城城驚軸且煉們渺漏兄酒文弊豬拈毀甭難梆顱舵查割紫純捎古堅(jiān)赦鵑彈奉癸樊育羨舌扣燼兜鞘吮佃據(jù)憋銥免注聘琶紳僧濘栽走竭暖封隆宋略處刺跌

35、伺博領(lǐng)晴性色楊衫貿(mào)峽募耪痞冤橢報(bào)育億篩稿粕喻局奢澡器薯瑯研排酉胺鬧跪證譚支惟儡俘攔俘轉(zhuǎn)捆莆維田學(xué)凜儈介蓑怖仲部壯莢州跡谷侗惶褐沫貫疏蠱瘦瓶贓奠案惱斜也吻傈砂枚俏蓄久實(shí)主涌昌醋毫頂帚瘟害展竟撾讀蛻銥螺墻囚輝搓堿碳濁呼吞平療憶肚跺亨貼友羅大蹭債忠鋪緬拆膛席覆硫腕顆袍撮。10。人生中每一次對自己心靈的釋惑,都是一種修行,都是一種成長。相信生命中的每一次磨礪,都會(huì)讓自己的人生折射出異常的光芒,都會(huì)讓自己的身心煥發(fā)出不一樣的香味。我們常常用人生中的一些痛,換得人生的一份成熟與成長,用一些不可避免的遺憾,換取生命的一份美麗。在大風(fēng)大雨,大風(fēng)大浪,大悲大喜之后,沉淀出一份人生的淡然與淡泊,靜好與安寧,深邃與寬厚,慈悲與欣然生活里的每個(gè)人,都是我們的一面鏡子,你給別人

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論