【正文】
因此, 這段代碼持行后a = 6, b = 7, c = 12。 這個問題將做為這個測驗(yàn)的一個愉快的結(jié)尾。 上面的代碼定義p1為一個指向結(jié)構(gòu)的指,p2為一個實(shí)際的結(jié)構(gòu),這也許不是你想要的。答案是:typedef更好。也可以用預(yù)處理器做類似的事。這就是上面的代碼,該代碼的輸出是Got a valid pointer。 if ((ptr = (char *)malloc(0)) == NULL) puts(Got a null pointer)。提出這些問題,我希望更多看到應(yīng)試者應(yīng)付問題的方法,而不是答案。在我的經(jīng)驗(yàn)里,好的嵌入式程序員非常準(zhǔn)確地明白硬件的細(xì)節(jié)和它的局限,然而PC機(jī)程序往往把硬件作為一個無法避免的煩惱。 /*139。這一點(diǎn)對于應(yīng)當(dāng)頻繁用到無符號數(shù)據(jù)類型的嵌入式系統(tǒng)來說是豐常重要的。 } 這個問題測試你是否懂得C語言中的整數(shù)自動轉(zhuǎn)換原則,我發(fā)現(xiàn)有些開發(fā)者懂得極少這些東西。不用說,如果你能得到后兩點(diǎn),那么你的被雇用前景越來越光明了。有些處理器/編譯器需要讓額處的寄存器入棧,有些處理器/編譯器就是不允許在ISR中做浮點(diǎn)運(yùn)算。如果你不懂這個,那么你不會被雇用的。 __interrupt double pute_area (double radius) { double area = PI * radius * radius。 即使你的品味更接近第二種方案,但我建議你在面試時使用第一種方案。典型的類似代碼如下: int *ptr。編譯器是一個純粹的ANSI編譯器。我希望看到幾個要點(diǎn):說明常數(shù)、|=和amp。 void set_bit3(void) { a |= BIT3。從道德講:永遠(yuǎn)不要讓一個非嵌入式的家伙粘實(shí)際硬件的邊。該被面者從沒做過任何嵌入式系統(tǒng)的工作。 } 位操作(Bit manipulation) 9. 嵌入式系統(tǒng)總是要用戶對變量或寄存器進(jìn)行位操作。 } 由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。這段代碼的目的是用來返指針*ptr指向值的平方,但是,由于*ptr指向一個volatile型參數(shù),編譯器將產(chǎn)生類似下面的代碼: int square(volatile int *ptr) { int a,b。 2). 是的。 } 下面是答案: 1). 是的。 假設(shè)被面試者正確地回答了這是問題(嗯,懷疑這否會是這樣),我將稍微深究一下,看一下這家伙是不是直正懂得volatile完全的重要性。下面是volatile變量的幾個例子: 1). 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器) 2). 一個中斷服務(wù)子程序中會訪問到的非自動變量(Nonautomatic variables) 3). 多線程應(yīng)用中被幾個任務(wù)共享的變量 回答不出這個問題的人是不會被雇傭的。簡而言之,這樣可以減少bug的出現(xiàn)。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學(xué)會感謝這點(diǎn)多余的信息。第四個意思a是一個指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。 int * const a。(如果你想知道更詳細(xì)的答案,仔細(xì)讀一下Saks的文章吧。這是一個應(yīng)試者的嚴(yán)重的缺點(diǎn),因?yàn)樗@然不懂得本地化數(shù)據(jù)和代碼范圍的好處和重要性。它是一個本地的全局變量。因?yàn)樵诒幻嬖嚨倪@段時間里,我確定我知道這個問題的答案。 // A pointer to a function a that takes an integer argument and returns an integer h) int (*a[10])(int)。 // A pointer to a pointer to an integer d) int a[10]。 應(yīng)試者如給出上面的方案,這說明或者他是一個匯編語言程序員(這也許是好事)或者他是一個想進(jìn)入新領(lǐng)域的B