美國留學(xué)選擇什么專業(yè)好?留學(xué)美國熱門專業(yè)推薦
2019-06-26
更新時間:2024-06-10 21:13作者:小樂
現(xiàn)在嵌入式發(fā)展這么快,很多人都開始走上嵌入式學(xué)習(xí)之路。據(jù)市場統(tǒng)計,一些畢業(yè)或者正在找工作的人在面試企業(yè)的時候會卡在這里,那就是面試題。很多人在面試中都表現(xiàn)得很好,但是在回答面試問題時卻沒有付出足夠的努力,最終被面試問題拒絕了,這使得找工作成為了一個難題,讓他們無路可走。天賦。而且,對于某些人來說也是如此。綜上所述,你可以通過嵌入式訪談向一些空難受害者學(xué)習(xí)。公司面試一般都是可以的。
(1)char * constp char const *p const char *p 以上三者有什么區(qū)別?
回答:
字符*常量p; //常量指針,p的值不能修改
字符常量* p; //指向常量的指針,所指向的常量值不能改變const char *p; //和char const *p
char * const p 是一個char 指針。指針是一個常量,不能修改。也就是說,像p=q 這樣的陳述是錯誤的;
char const * p 和const char * p 是同一類型的char 指針。指針指向的字符被視為常量,不允許修改。也就是說,像*p=q 這樣的語句是錯誤的。
(2)char str1[]='abc'; charstr2[]='abc'; const char str3[]='abc'; const charstr4[]='abc'; const char *str5='abc'; const char *str6='abc'; char *str7='abc'; char *str8='abc';cout (str1==str2) endl; cout ( str3==str4 ) endl; cout ( str5==str6 ) endl; cout ( str7==str8 ) endl;
結(jié)果是: 0 0 1 1 str1,str2,str3,str4是數(shù)組變量,它們有自己的內(nèi)存空間;而str5、str6、str7、str8是指針,它們指向同一個常量區(qū)。
關(guān)于嵌入式物聯(lián)網(wǎng),確實有很多東西需要學(xué)習(xí)。不要學(xué)錯路線和內(nèi)容,導(dǎo)致你的薪資水漲船高!
我免費給大家分享一個數(shù)據(jù)包,差不多150G。學(xué)習(xí)內(nèi)容、面試、項目都比較新、全面!據(jù)估計,在網(wǎng)上購買某種魚至少要花費幾十美元。
點此找助手0元獲?。簰叽a進群獲取資料
(3)什么是預(yù)編譯以及什么時候需要預(yù)編譯:
回答:
1. 始終使用不經(jīng)常更改的大型代碼體。
2. 程序由多個模塊組成,所有模塊都使用一組標準的包含文件和相同的編譯選項。在這種情況下,所有包含文件都可以預(yù)編譯成預(yù)編譯頭。
預(yù)編譯指令表示編譯器在程序正式編譯之前執(zhí)行的操作,可以放置在程序中的任何位置。
(4)下面代碼中的兩個sizeof用法有問題嗎?
[Cyi] void UpperCase( char str[] ) //將str 中的小寫字母轉(zhuǎn)換為大寫字母{ for( size_t i=0; i
(5) 嵌入式系統(tǒng)中經(jīng)常使用無限循環(huán)。 C語言中如何編寫無限循環(huán)?
這個問題有多種解決方案。我的首選解決方案是:
同時(1)
{
}
一些程序員更喜歡以下解決方案:
為了(;)
{
}
這個實現(xiàn)讓我很困惑,因為語法并不能準確表達正在發(fā)生的事情。如果候選人給出
作為解決方案,我將以此為契機來探索他們是如何做到這一點的
基本的。如果他們的基本答案是:“我被教導(dǎo)要這樣做,但從未想過為什么?!?
給我留下不好的印象。
第三種選擇是使用goto
循環(huán):
.
轉(zhuǎn)到循環(huán);
如果候選人給出了上述解決方案,則意味著他要么是一名匯編語言程序員(這可能是一件好事),要么他
我是一名BASIC/FORTRAN 程序員,想要進入一個新領(lǐng)域。
常量
(6)關(guān)鍵字const是什么意思?
當我聽到受訪者說“const 意味著恒定”時,我就知道我正在與一個業(yè)余愛好者打交道。
去年Dan Saks在他的文章中已經(jīng)完整總結(jié)了const的所有用法,所以ESP(譯者:Embedded)
每個系統(tǒng)編程的讀者都應(yīng)該非常熟悉const 能做什么和不能做什么。如果你來自
如果不閱讀那篇文章,只要能夠知道const 意味著“只讀”就可以了。雖然這個答案并不完整
答案,但我接受它作為正確答案。 (如果想知道更詳細的答案,請仔細閱讀Saks
文章。 )如果候選人能夠正確回答這個問題,我會問他一個附加問題:以下所有陳述
什么意思
常量整型;
int 常量a;
常量int *a;
int * 常量a;
int const * 一個常量;
前兩者作用相同,a是常整數(shù)。第三個表示a 是一個指向常量整數(shù)的指針(也
也就是說,整數(shù)不能修改,但指針可以)。第四個含義a 是指向整數(shù)的常量指針(也可以
也就是說,指針指向的整數(shù)可以修改,但指針不能修改)。最后一位表示a是1
指向常整數(shù)的常指針(即指針所指向的整數(shù)不能被修改,指針也不能被修改。
可修改)。如果候選人能夠正確回答這些問題,那么他或她就給我留下了良好的印象。順便一提
總而言之,你可能會問,即使不使用const關(guān)鍵字,仍然很容易寫出功能正確的程序,那么
為什么我還是這么看重const這個關(guān)鍵字呢?我有以下幾個原因:
1)。關(guān)鍵字const的作用是向閱讀你代碼的人傳達非常有用的信息。其實它聲明了一個參數(shù)
它是一個常量,告訴用戶該參數(shù)的應(yīng)用目的。如果您曾經(jīng)花費大量時間清理別人的垃圾
垃圾,你很快就會學(xué)會欣賞這些額外的信息。 (當然,懂得使用const的程序員很少會留下垃圾
讓其他人清理垃圾。 )
2)。使用const 關(guān)鍵字可以通過為優(yōu)化器提供一些附加信息來生成更緊湊的代碼。
3)。合理使用關(guān)鍵字const可以讓編譯器自然地保護那些不想改變的參數(shù),防止它們被改變。
被無意的代碼修改。簡而言之,這減少了錯誤的發(fā)生。
易揮發(fā)的
(7) 關(guān)鍵字volatile 的含義是什么并給出三個不同的例子。
定義為volatile 的變量意味著該變量可能會被意外改變,這樣編譯器就不會
假設(shè)該變量的值。準確地說,優(yōu)化器每次使用該變量時都必須仔細地重新讀取。
獲取該變量的值,而不是使用存儲在寄存器中的備份。以下是易失性變量的一些示例:
1)。并行設(shè)備的硬件寄存器(如狀態(tài)寄存器)
2)。將在中斷服務(wù)程序中訪問的非自動變量(非自動變量)
3)。多線程應(yīng)用程序中多個任務(wù)共享的變量
不能回答這個問題的人將不會被錄用。我認為這是C 程序員與嵌入式系統(tǒng)程序員最大的區(qū)別
基本問題。嵌入式系統(tǒng)程序員經(jīng)常與硬件、中斷、RTOS等打交道,所有這些都需要vo
緯度變量。不了解易失性內(nèi)容可能會導(dǎo)致災(zāi)難。
假設(shè)受訪者正確回答了這個問題(好吧,懷疑情況確實如此),我將深入挖掘一下,看看
讓我們看看這個人是否完全理解volatility 的重要性。
1)。參數(shù)可以同時是const 和volatile 嗎?解釋為什么。
2)。指針可以是易失性的嗎?解釋為什么。
3)。以下函數(shù)有什么問題:
int square(易失性int *ptr)
{
返回*ptr * *ptr;
}
答案如下:
1)。是的。只讀狀態(tài)寄存器就是一個例子。它是不穩(wěn)定的,因為它可能會發(fā)生意外的改變。
它是const,因為程序不應(yīng)該嘗試修改它。
2)。是的。雖然這種情況并不常見。一個例子是當服務(wù)例程修改指向緩沖區(qū)的指針時
指針。
3)。這段代碼中有一個技巧。這段代碼的目的是返回指針*ptr所指向的值的平方。然而,通過
由于*ptr指向一個易失性參數(shù),編譯器將生成類似以下的代碼:
int square(易失性int *ptr)
{
整數(shù)a,b;
a=*ptr;
b=*ptr;
返回a*b;
}
由于*ptr 的值可能會意外更改,因此a 和b 可能會不同。因此,此代碼可能不會返回
是您期望的平方值!正確的代碼如下:
長方形(易失性int *ptr)
{
整數(shù)a;
a=*ptr;
返回a*a;
}
位操作
(8)嵌入式系統(tǒng)總是要求用戶對變量或寄存器進行位操作。給定一個整型變量a,寫兩段代碼
,第一個設(shè)置a 的位3,第二個清除a 的位3。上述兩個操作中,其他位保持不變。
對于這個問題有三個基本的回答
1)。不知道如何開始。受訪者從未做過任何嵌入式系統(tǒng)工作。
2)。使用位域。位域是被扔進C語言死胡同的東西。它確保您的代碼可以在不同的編譯器中運行。
它們之間不可移植,并且還確保您的代碼不可重用。我最近很不幸地見到了英飛凌
為其更復(fù)雜的通信芯片編寫的驅(qū)動程序使用位字段,因此對我來說完全沒用,因為我的程序員
翻譯器以其他方式實現(xiàn)位字段。道德上:永遠不要讓一個非嵌入式人員留下來
國際硬件優(yōu)勢。
3)。使用#defines 和位掩碼進行操作。這是一種非常便攜的方法,應(yīng)該使用
方法。最佳解決方案如下:
#定義BIT3 (0x1 3)
靜態(tài)整型;
無效set_bit3(無效)
{
一個|=位3;
}
無效清除_bit3(無效)
{
a=~BIT3;
}
有些人喜歡定義一個用于設(shè)置和清除值的掩碼并定義一些描述性常量,這也是可以接受的。
我想看的幾個要點: 常量、|=和=~ 操作的解釋。
數(shù)據(jù)聲明
(9) 利用變量a給出如下定義
a) 一個整數(shù)
b) 指向整數(shù)的指針
c) 指向指針的指針,它指向的指針是一個整數(shù)(Apointertoapointer
為整數(shù))
d) 10 個整數(shù)的數(shù)組
e) 一個由10 個整數(shù)指針組成的數(shù)組
整數(shù))
f) 指向10 個整數(shù)的數(shù)組的指針
g) 指向一個函數(shù)的指針,該函數(shù)接受一個整數(shù)參數(shù)并返回一個整數(shù)(Apointertoafu
以整數(shù)作為參數(shù)并返回整數(shù)的函數(shù))
h) 一個由10 個指針組成的數(shù)組,指向一個采用整數(shù)參數(shù)并返回整數(shù)的函數(shù)
一個由十個指針組成的數(shù)組,指向采用整數(shù)參數(shù)和r 的函數(shù)
返回一個整數(shù))
答案是:
a)整數(shù)a; //一個整數(shù)
b)整數(shù)*a; //指向整數(shù)的指針
c) int **a; //指向整數(shù)的指針
d) int a[10]; //10 個整數(shù)的數(shù)組
e) int *a[10]; //10 個整數(shù)指針的數(shù)組
f) int (*a)[10]; //指向10 個整數(shù)的數(shù)組的指針
g) int (*a)(int); //指向帶有整數(shù)參數(shù)的函數(shù)a 的指針
并返回一個整數(shù)
h) int (*a[10])(int); //一個由10 個指向采用int 的函數(shù)的指針組成的數(shù)組
eger 參數(shù)并返回一個整數(shù)
人們經(jīng)常聲稱這里的一些問題需要翻一本書才能回答,我同意。當我
在寫這篇文章時,我確實檢查了書以確保語法正確。
但當我接受采訪時,我希望被問到這個問題(或類似的問題)。因為在接受采訪時
有一段時間,我確信我知道這個問題的答案。如果候選人不知道
所有的答案(或者至少是大部分的答案),那么就沒有為這次面試做準備。如果面試官沒有
準備這次采訪,那么他可以準備什么呢?
靜止的
(10)關(guān)鍵字static的作用是什么
這個簡單的問題很少得到完整的回答。在C語言中,關(guān)鍵字static有三個明顯的作用:
1)。在函數(shù)體中,聲明為static 的變量在調(diào)用函數(shù)時保持其值。
2)。在模塊內(nèi)部(但在函數(shù)體外部),聲明為static 的變量可以被模塊中使用的函數(shù)訪問,
但不能被模塊外的其他函數(shù)訪問。它是一個局部全局變量。
3)。在模塊內(nèi),聲明為靜態(tài)的函數(shù)只能由該模塊中的其他函數(shù)調(diào)用。也就是說,這個
函數(shù)僅限于聲明它的模塊的本地范圍。
大多數(shù)考生能正確回答第一部分,有些人能正確回答第二部分,很少有人能理解第二部分。
三個部分。對于顯然不了解本地化數(shù)據(jù)和代碼范圍的好處的候選人來說,這是一個嚴重的缺點
和重要性。
(11) 對于32位機器,該機器的指針是多少位?回答:
只需查看地址總線中的位數(shù)即可確定指針有多少位。 80386以后的機器都使用32條數(shù)據(jù)總線。所以指針的位數(shù)是4個字節(jié)。
(12) 主函數(shù)()
{
inta[5]={1,2,3,4,5};
int *ptr=(int*)(a+1);
printf('%d,%d',*(a+1),*(ptr-1));
}
答案:2. 5 *(a+1)是a[1],*(ptr-1)是a[4],執(zhí)行結(jié)果是2,5 a+1不是首地址+1,系統(tǒng)會認為添加一個a 數(shù)組的偏移量就是數(shù)組大小的偏移量(本例中為5 個int) int *ptr=(int *)(a+1);那么ptr其實就是(a[5]),也就是a+5 原因如下:a是一個數(shù)組指針,它的類型是int(*)[5];而給指針加1則需要根據(jù)指針類型加上一定的值。不同類型的指針加1后大小增加的方式不同。 a的長度為5個int數(shù)組指針,所以需要加上5*sizeof(int),所以ptr實際上是a[5],但是prt和(a+1)不是同一類型(這一點很重要) ,所以prt-1只會減去sizeof (int*) a,a的地址是相同的,但含義不同。 a是數(shù)組首地址,即a[0]的地址,a是對象(數(shù)組)的首地址,a+1是數(shù)組的下一個元素。的地址,即a[1],a+1是下一個對象的地址,即a[5]。
(13)下面的代碼有什么問題:
int main() { 字符;字符*str=a; strcpy(str,'你好'); printf(str);返回0; }
答:沒有為str分配內(nèi)存空間,會出現(xiàn)異常。問題在于將字符串復(fù)制到字符變量指針指向的地址中。雖然可以正確輸出結(jié)果,但由于固有讀寫越界,導(dǎo)致程序崩潰。
(14)char* s='AAA'; printf('%s',s); s[0]='B'; printf('%s',s);怎么了?
答案:“AAA”是一個字符串常量。 s是一個指針,指向這個字符串常量,所以聲明s的時候有問題。成本char*s='AAA';并且由于它是一個常量,所以對s[0]的賦值操作是非法的。