嵌入式常见笔试题总结(5)
生活随笔
收集整理的這篇文章主要介紹了
嵌入式常见笔试题总结(5)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、 如何在C中初始化一個字符數(shù)組。
這個問題看似很簡單,但是我們要將最簡單的問題用最嚴(yán)謹(jǐn)?shù)膽B(tài)度來對待。關(guān)鍵的地方:初始化、字符型、數(shù)組。最簡單的方法是char array[];。這個問題看似解決了,但是在初始化上好像還欠缺點什么,個人認(rèn)為:char array[5]={'1','2','3','4','5'};或者char array[5]={"12345"};或者char array[2][10]={"China","Beijing"};也許更符合“初始化”的意思。
2、 如何在C中為一個數(shù)組分配空間。
最簡單的方法是:char array[5];意思是分配給數(shù)組array一個5個字節(jié)的空間。但是我們要知道在C中數(shù)組其實就是一個名字,其實質(zhì)含義就是指針,比如char array[];是到底分配的多少空間?所以我們要將其分成為兩種不同的形式給出答案:
一種是棧的形式:char array[5];
一種是堆的形式:char *array; array=(char *)malloc(5);//C++: array=new char[5];
堆和棧的含義其實我也沒弄太透徹,改天明白了再發(fā)一篇。
我們要明白的是,第一種形式空間分配的大小可能會受操作系統(tǒng)的限制,比如windows會限制在2M;第二種形式成空間分配很靈活,想分配多少分配多少,只要RAM夠大。
3、 如何初始化一個指針數(shù)組。
首先明確一個概念,就是指向數(shù)組的指針,和存放指針的數(shù)組。
指向數(shù)組的指針:char (*array)[5];含義是一個指向存放5個字符的數(shù)組的指針。
存放指針的數(shù)組:char *array[5];含義是一個數(shù)組中存放了5個指向字符型數(shù)據(jù)的指針。
按照題意,我理解為初始化一個存放指針的數(shù)組,char *array[2]={"China","Beijing"};其含義是初始化了一個有兩個指向字符型數(shù)據(jù)的指針的數(shù)組,這兩個指針分別指向字符串"China"和"Beijing"。
4、如何定義一個有10個元素的整數(shù)型指針數(shù)組。
既然只是定義而不是初始化,那就很簡單且沒有爭議了:int *array[10];。
5、 s[10]的另外一種表達(dá)方式是什么。
前面說過了,數(shù)組和指針其實是數(shù)據(jù)存在形態(tài)的兩種表現(xiàn)形式,如果說對于數(shù)組s[],我們知道*s=s[0],那么s[10]的另一種表達(dá)方式就是:*(s+10)。
6、 GCC3.2.2版本中支持哪幾種編程語言。
這個問題實在變態(tài),就像問你#error的作用是什么一樣。不可否認(rèn),gcc是linux下一個亮點,是一個備受無數(shù)程序員推崇的編譯器,其優(yōu)點省略 1000字,有興趣可以自己查,我翻了翻書,書上曰:支持C,C++,Java,Obj-C,Ada,Fortran,Pascal,Modula-3等語言,這個“等”比較要命,不過我認(rèn)為已經(jīng)很全了,如果認(rèn)為還是不全,干脆把ASM也加上算了,不過那已經(jīng)不算是編譯了。
7、 要使用CHAR_BIT需要包含哪個頭文件。
如果結(jié)合上面的問題,答題的人估計會認(rèn)為自己撞鬼了,這個問題實在是……搜索了一下,應(yīng)該是limits.h。
8、 對(-1.2345)取整是多少?
其實不同的取整函數(shù)可能有不同的結(jié)果,不過這個數(shù)沒有太大的爭議,答案是-1。
9、 如何讓局部變量具有全局生命期。
具體的生命期的概念我覺得我還要好好深入的學(xué)習(xí)一下,但是這個題目還算比較簡單,即用static修飾就可以了,但是只是生命期延長,范圍并沒有擴(kuò)大,除非把這個變量定義在函數(shù)體外的靜態(tài)區(qū),不過那樣就變成全局變量了,仿佛不符合題目要求。
10、C中的常量字符串應(yīng)在何時定義?
這個問題說實話不是很理解題干的意思,據(jù)我理解,有兩種情況,一種是預(yù)處理階段,用#define定義;還有就是使用const修飾詞,不過const修飾的是一個變量,其含義是“只讀”,稱之為常量并不準(zhǔn)確,但是確實可以用操作變量的方法當(dāng)常量用。所以還是第一種比較靠譜。
11、如何在兩個.c文件中引用對方的變量。
這個問題也問的挺含糊的,怎么說呢,最簡單最直接的方法是為變量添加extern修飾詞,當(dāng)然,這個變量必須是全局變量。還有一種就是利用函數(shù)調(diào)用來進(jìn)行變量的間接引用,比如這個C文件中的一個函數(shù)引用另外一個C中的函數(shù),將變量通過實參的形式傳遞過去。不過題目既然說是引用,那么還是用第一個答案好了。
12、使用malloc之前需要做什么準(zhǔn)備工作。
其實準(zhǔn)備工作很多啊,比如你需要一臺計算機(jī)之類的。玩笑話,我們首先要知道m(xù)alloc的用途,簡單的說就是動態(tài)的分配一段空間,返回這段空間的頭指針。實際的準(zhǔn)備工作可以這么分:需要這段空間的指針是否存在,若不存在,則定義一個指針用來被賦值,還要清楚要返回一個什么類型的指針,分配的空間是否合理;如果指針已經(jīng)存在,那么在重新將新的空間頭地址賦值給這個指針之前,要先判斷指針是否為NULL,如果不是要free一下,否則原來的空間就會被浪費,或者出錯,free之后就按照前一種情形考慮就可以了。
13、realloc函數(shù)在使用上要注意什么問題。
這個函數(shù)我也才知道的,汗一個。據(jù)我的初步理解,這個函數(shù)的作用是重新分配空間大小,返回的頭指針不變,只是改變空間大小。既然是改變,就有變大、變小和為什么改變的問題。變大,要注意不能大到內(nèi)存溢出;變小,那變小的那部分空間會被征用,原有數(shù)據(jù)不再存在;為什么改變,如果是想重新挪作他用,還是先 free了吧。
14、strtok函數(shù)在使用上要注意什么問題。
這個問題我不知道能不能回答全面,因為實在是用的很少。這個函數(shù)的作用是分割字符串,但是要分割的字符串不能是常量,這是要注意的。比如先定義一個字符串:char array[]="part1,part2";,strtok的原形是char *strtok(char *string, char *delim);,我們將","作為分隔符,先用pt=strtok(array,",");,得到的結(jié)果print出來就是"part1",那后面的呢,要寫成pt=strtok(NULL,",");,注意,要用NULL,如果被分割的字符串會被分成N段,那從第二次開始就一直要用NULL。總結(jié)起來,需要注意的是:被分割的字符串和分隔符都要使用變量;除第一次使用指向字符串的指針外,之后的都要使用NULL;注意使用這個函數(shù)的時候千萬別把指針跟丟了,不然就全亂了。
15、gets函數(shù)在使用上要注意什么問題。
這是一個鍵盤輸入函數(shù),將輸入字符串的頭地址返回。說到要注意的問題,我還是先查了一下網(wǎng)上的一些情況,需要注意的就是gets以輸入回車結(jié)束,這個地球人都知道,但是很多人不知道的是,當(dāng)你輸入完一個字符串后,這個字符串可能依然存在于這個標(biāo)準(zhǔn)輸入流之中,當(dāng)再次使用gets的時候,也許會把上次輸入的東西讀出來,所以應(yīng)該在使用之后用fflush(stdin);處理一下,將輸入流清空。最后也還是要注意溢出的問題。關(guān)于這個答案我比較含糊,不知道有沒有高人高見?
16、C語言的詞法分析在長度規(guī)則方面采用的是什么策略?
我無語……聞所未聞啊……還是搜索了一下,有一篇文章,地址是:http://202.117.80.9/jp2005/20/kcwz/wlkc/wlkc/03/3_5_2.htm,是關(guān)于詞法分析器的。其中提到了兩點策略: (1) 按最長匹配原則確定被選的詞型;(2) 如果一個字符串能為若干個詞型匹配,則排列在最前面的詞型被選中。不知道是不是題干的要求,還是其他什么。我乃一介草民,望達(dá)人指點迷津!
17、a+++++b所表示的是什么意思?有什么問題?
這個東西(稱之為東西一點都不過分)其實并沒有語法錯誤,按照C對運算符等級的劃分,++的優(yōu)先級大于+,那么這句話會被編譯器看做:(a++)+(++ b),這回明白了吧。有什么問題,語法上沒有問題,有的是道德上的問題!作為一個優(yōu)秀的程序員,我們要力求語句的合法性和可讀性,如果寫這句的人是在一個 team里,那么他基本會被打的半死……最后討論一下結(jié)果:假設(shè)a之前的值是3,b是4,那么運行完這個變態(tài)語句后,a的值是4,b是5,語句的結(jié)果是 8。
18、如何定義Bool變量的TRUE和FALSE的值。
不知道這個題有什么陷阱,寫到現(xiàn)在神經(jīng)已經(jīng)大了,一般來說先要把TURE和FALSE給定義了,使用#define就可以:
#define TURE 1
#define FALSE 0
如果有一個變量需要定義成bool型的,舉個例子:bool a=TURE;就可以了。
19、C語言的const的含義是什么。在定義常量時,為什么推薦使用const,而不是#define。
首先,這個題干抽了10題回答的一個大嘴巴。關(guān)于常量的概念看來我要好好看看書了……我說過了,const修飾詞可以將一個變量修飾為“只讀”,這個就能稱為常量么?姑且認(rèn)為可以。回到題目中,const是只讀的意思,它限定一個變量不允許被改變,誰都不能改!既然是修飾變量,那么變量的類型就可以豐富多彩,int啊,char啊,只要C認(rèn)識的都可以;但是#define就不可以了,在預(yù)處理階段缺乏類型檢測機(jī)制,有可能會出錯。還有就是變量可以 extern,但是#define就不可以。貌似const還可以節(jié)省RAM,這個我倒是沒有考證過。至于const的用法和作用,有很多,我會總結(jié)后發(fā)上來。
20、C語言的volatile的含義是什么。使用時會對編譯器有什么暗示。
終于最后一題了,容易么……如果這個測試是一個關(guān)于嵌入式的,那么這道題非常重要!!從詞面上講,volatile的意思是易變的,也就是說,在程序運行過程中,有一些變量可能會被莫名其妙的改變,而優(yōu)化器為了節(jié)約時間,有時候不會重讀這個變量的真實值,而是去讀在寄存器的備份,這樣的話,這個變量的真實值反而被優(yōu)化器給“優(yōu)化”掉了,用時髦的詞說就是被“和諧”了。如果使用了這個修飾詞,就是通知編譯器別犯懶,老老實實去重新讀一遍!可能我說的太“通俗”了,那么我引用一下“大師”的標(biāo)準(zhǔn)解釋:
volatile的本意是“易變的” 。
由于訪問寄存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優(yōu)化,但有可能會讀臟數(shù)據(jù)。當(dāng)要求使用volatile 聲明的變量的值的時候,系統(tǒng)總是重新從它所在的內(nèi)存讀取數(shù)據(jù),即使它前面的指令剛剛從該處讀取過數(shù)據(jù)。而且讀取的數(shù)據(jù)立刻被保存。
精確地說就是,優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。
下面是volatile變量的幾個例子:
1). 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)
2). 一個中斷服務(wù)子程序中會訪問到的非自動變量(Non-automatic variables)
3). 多線程應(yīng)用中被幾個任務(wù)共享的變量
嵌入式系統(tǒng)程序員經(jīng)常同硬件、中斷、RTOS等等打交道,所用這些都要求volatile變量。不懂得volatile內(nèi)容將會帶來災(zāi)難。
這個問題看似很簡單,但是我們要將最簡單的問題用最嚴(yán)謹(jǐn)?shù)膽B(tài)度來對待。關(guān)鍵的地方:初始化、字符型、數(shù)組。最簡單的方法是char array[];。這個問題看似解決了,但是在初始化上好像還欠缺點什么,個人認(rèn)為:char array[5]={'1','2','3','4','5'};或者char array[5]={"12345"};或者char array[2][10]={"China","Beijing"};也許更符合“初始化”的意思。
2、 如何在C中為一個數(shù)組分配空間。
最簡單的方法是:char array[5];意思是分配給數(shù)組array一個5個字節(jié)的空間。但是我們要知道在C中數(shù)組其實就是一個名字,其實質(zhì)含義就是指針,比如char array[];是到底分配的多少空間?所以我們要將其分成為兩種不同的形式給出答案:
一種是棧的形式:char array[5];
一種是堆的形式:char *array; array=(char *)malloc(5);//C++: array=new char[5];
堆和棧的含義其實我也沒弄太透徹,改天明白了再發(fā)一篇。
我們要明白的是,第一種形式空間分配的大小可能會受操作系統(tǒng)的限制,比如windows會限制在2M;第二種形式成空間分配很靈活,想分配多少分配多少,只要RAM夠大。
3、 如何初始化一個指針數(shù)組。
首先明確一個概念,就是指向數(shù)組的指針,和存放指針的數(shù)組。
指向數(shù)組的指針:char (*array)[5];含義是一個指向存放5個字符的數(shù)組的指針。
存放指針的數(shù)組:char *array[5];含義是一個數(shù)組中存放了5個指向字符型數(shù)據(jù)的指針。
按照題意,我理解為初始化一個存放指針的數(shù)組,char *array[2]={"China","Beijing"};其含義是初始化了一個有兩個指向字符型數(shù)據(jù)的指針的數(shù)組,這兩個指針分別指向字符串"China"和"Beijing"。
4、如何定義一個有10個元素的整數(shù)型指針數(shù)組。
既然只是定義而不是初始化,那就很簡單且沒有爭議了:int *array[10];。
5、 s[10]的另外一種表達(dá)方式是什么。
前面說過了,數(shù)組和指針其實是數(shù)據(jù)存在形態(tài)的兩種表現(xiàn)形式,如果說對于數(shù)組s[],我們知道*s=s[0],那么s[10]的另一種表達(dá)方式就是:*(s+10)。
6、 GCC3.2.2版本中支持哪幾種編程語言。
這個問題實在變態(tài),就像問你#error的作用是什么一樣。不可否認(rèn),gcc是linux下一個亮點,是一個備受無數(shù)程序員推崇的編譯器,其優(yōu)點省略 1000字,有興趣可以自己查,我翻了翻書,書上曰:支持C,C++,Java,Obj-C,Ada,Fortran,Pascal,Modula-3等語言,這個“等”比較要命,不過我認(rèn)為已經(jīng)很全了,如果認(rèn)為還是不全,干脆把ASM也加上算了,不過那已經(jīng)不算是編譯了。
7、 要使用CHAR_BIT需要包含哪個頭文件。
如果結(jié)合上面的問題,答題的人估計會認(rèn)為自己撞鬼了,這個問題實在是……搜索了一下,應(yīng)該是limits.h。
8、 對(-1.2345)取整是多少?
其實不同的取整函數(shù)可能有不同的結(jié)果,不過這個數(shù)沒有太大的爭議,答案是-1。
9、 如何讓局部變量具有全局生命期。
具體的生命期的概念我覺得我還要好好深入的學(xué)習(xí)一下,但是這個題目還算比較簡單,即用static修飾就可以了,但是只是生命期延長,范圍并沒有擴(kuò)大,除非把這個變量定義在函數(shù)體外的靜態(tài)區(qū),不過那樣就變成全局變量了,仿佛不符合題目要求。
10、C中的常量字符串應(yīng)在何時定義?
這個問題說實話不是很理解題干的意思,據(jù)我理解,有兩種情況,一種是預(yù)處理階段,用#define定義;還有就是使用const修飾詞,不過const修飾的是一個變量,其含義是“只讀”,稱之為常量并不準(zhǔn)確,但是確實可以用操作變量的方法當(dāng)常量用。所以還是第一種比較靠譜。
11、如何在兩個.c文件中引用對方的變量。
這個問題也問的挺含糊的,怎么說呢,最簡單最直接的方法是為變量添加extern修飾詞,當(dāng)然,這個變量必須是全局變量。還有一種就是利用函數(shù)調(diào)用來進(jìn)行變量的間接引用,比如這個C文件中的一個函數(shù)引用另外一個C中的函數(shù),將變量通過實參的形式傳遞過去。不過題目既然說是引用,那么還是用第一個答案好了。
12、使用malloc之前需要做什么準(zhǔn)備工作。
其實準(zhǔn)備工作很多啊,比如你需要一臺計算機(jī)之類的。玩笑話,我們首先要知道m(xù)alloc的用途,簡單的說就是動態(tài)的分配一段空間,返回這段空間的頭指針。實際的準(zhǔn)備工作可以這么分:需要這段空間的指針是否存在,若不存在,則定義一個指針用來被賦值,還要清楚要返回一個什么類型的指針,分配的空間是否合理;如果指針已經(jīng)存在,那么在重新將新的空間頭地址賦值給這個指針之前,要先判斷指針是否為NULL,如果不是要free一下,否則原來的空間就會被浪費,或者出錯,free之后就按照前一種情形考慮就可以了。
13、realloc函數(shù)在使用上要注意什么問題。
這個函數(shù)我也才知道的,汗一個。據(jù)我的初步理解,這個函數(shù)的作用是重新分配空間大小,返回的頭指針不變,只是改變空間大小。既然是改變,就有變大、變小和為什么改變的問題。變大,要注意不能大到內(nèi)存溢出;變小,那變小的那部分空間會被征用,原有數(shù)據(jù)不再存在;為什么改變,如果是想重新挪作他用,還是先 free了吧。
14、strtok函數(shù)在使用上要注意什么問題。
這個問題我不知道能不能回答全面,因為實在是用的很少。這個函數(shù)的作用是分割字符串,但是要分割的字符串不能是常量,這是要注意的。比如先定義一個字符串:char array[]="part1,part2";,strtok的原形是char *strtok(char *string, char *delim);,我們將","作為分隔符,先用pt=strtok(array,",");,得到的結(jié)果print出來就是"part1",那后面的呢,要寫成pt=strtok(NULL,",");,注意,要用NULL,如果被分割的字符串會被分成N段,那從第二次開始就一直要用NULL。總結(jié)起來,需要注意的是:被分割的字符串和分隔符都要使用變量;除第一次使用指向字符串的指針外,之后的都要使用NULL;注意使用這個函數(shù)的時候千萬別把指針跟丟了,不然就全亂了。
15、gets函數(shù)在使用上要注意什么問題。
這是一個鍵盤輸入函數(shù),將輸入字符串的頭地址返回。說到要注意的問題,我還是先查了一下網(wǎng)上的一些情況,需要注意的就是gets以輸入回車結(jié)束,這個地球人都知道,但是很多人不知道的是,當(dāng)你輸入完一個字符串后,這個字符串可能依然存在于這個標(biāo)準(zhǔn)輸入流之中,當(dāng)再次使用gets的時候,也許會把上次輸入的東西讀出來,所以應(yīng)該在使用之后用fflush(stdin);處理一下,將輸入流清空。最后也還是要注意溢出的問題。關(guān)于這個答案我比較含糊,不知道有沒有高人高見?
16、C語言的詞法分析在長度規(guī)則方面采用的是什么策略?
我無語……聞所未聞啊……還是搜索了一下,有一篇文章,地址是:http://202.117.80.9/jp2005/20/kcwz/wlkc/wlkc/03/3_5_2.htm,是關(guān)于詞法分析器的。其中提到了兩點策略: (1) 按最長匹配原則確定被選的詞型;(2) 如果一個字符串能為若干個詞型匹配,則排列在最前面的詞型被選中。不知道是不是題干的要求,還是其他什么。我乃一介草民,望達(dá)人指點迷津!
17、a+++++b所表示的是什么意思?有什么問題?
這個東西(稱之為東西一點都不過分)其實并沒有語法錯誤,按照C對運算符等級的劃分,++的優(yōu)先級大于+,那么這句話會被編譯器看做:(a++)+(++ b),這回明白了吧。有什么問題,語法上沒有問題,有的是道德上的問題!作為一個優(yōu)秀的程序員,我們要力求語句的合法性和可讀性,如果寫這句的人是在一個 team里,那么他基本會被打的半死……最后討論一下結(jié)果:假設(shè)a之前的值是3,b是4,那么運行完這個變態(tài)語句后,a的值是4,b是5,語句的結(jié)果是 8。
18、如何定義Bool變量的TRUE和FALSE的值。
不知道這個題有什么陷阱,寫到現(xiàn)在神經(jīng)已經(jīng)大了,一般來說先要把TURE和FALSE給定義了,使用#define就可以:
#define TURE 1
#define FALSE 0
如果有一個變量需要定義成bool型的,舉個例子:bool a=TURE;就可以了。
19、C語言的const的含義是什么。在定義常量時,為什么推薦使用const,而不是#define。
首先,這個題干抽了10題回答的一個大嘴巴。關(guān)于常量的概念看來我要好好看看書了……我說過了,const修飾詞可以將一個變量修飾為“只讀”,這個就能稱為常量么?姑且認(rèn)為可以。回到題目中,const是只讀的意思,它限定一個變量不允許被改變,誰都不能改!既然是修飾變量,那么變量的類型就可以豐富多彩,int啊,char啊,只要C認(rèn)識的都可以;但是#define就不可以了,在預(yù)處理階段缺乏類型檢測機(jī)制,有可能會出錯。還有就是變量可以 extern,但是#define就不可以。貌似const還可以節(jié)省RAM,這個我倒是沒有考證過。至于const的用法和作用,有很多,我會總結(jié)后發(fā)上來。
20、C語言的volatile的含義是什么。使用時會對編譯器有什么暗示。
終于最后一題了,容易么……如果這個測試是一個關(guān)于嵌入式的,那么這道題非常重要!!從詞面上講,volatile的意思是易變的,也就是說,在程序運行過程中,有一些變量可能會被莫名其妙的改變,而優(yōu)化器為了節(jié)約時間,有時候不會重讀這個變量的真實值,而是去讀在寄存器的備份,這樣的話,這個變量的真實值反而被優(yōu)化器給“優(yōu)化”掉了,用時髦的詞說就是被“和諧”了。如果使用了這個修飾詞,就是通知編譯器別犯懶,老老實實去重新讀一遍!可能我說的太“通俗”了,那么我引用一下“大師”的標(biāo)準(zhǔn)解釋:
volatile的本意是“易變的” 。
由于訪問寄存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優(yōu)化,但有可能會讀臟數(shù)據(jù)。當(dāng)要求使用volatile 聲明的變量的值的時候,系統(tǒng)總是重新從它所在的內(nèi)存讀取數(shù)據(jù),即使它前面的指令剛剛從該處讀取過數(shù)據(jù)。而且讀取的數(shù)據(jù)立刻被保存。
精確地說就是,優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。
下面是volatile變量的幾個例子:
1). 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)
2). 一個中斷服務(wù)子程序中會訪問到的非自動變量(Non-automatic variables)
3). 多線程應(yīng)用中被幾個任務(wù)共享的變量
嵌入式系統(tǒng)程序員經(jīng)常同硬件、中斷、RTOS等等打交道,所用這些都要求volatile變量。不懂得volatile內(nèi)容將會帶來災(zāi)難。
總結(jié)
以上是生活随笔為你收集整理的嵌入式常见笔试题总结(5)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言基础知识目录大纲
- 下一篇: nova红a6se升级鸿蒙,华为nova