嵌入式 C 面試 考點

1.const的作用是什麼?

第一,限定一個只讀變量(不是常量)。如const double PI=3.14;第二,限定函數參數,如,void function(const char *p)//函數只能讀取不能改變其變量p的值

2.關鍵字volatile有什麼含意?

volatile影響編譯器編譯的結果,指出,volatile變量是隨時可能發生變化的,與volatile變量有關的運算,不要進行編譯優化,以免出錯。

3.嵌入式系統總是要用戶對變量或寄存器進行位操作。給定一個整型變量a,寫兩段代碼,第一個設置a的bit3,第二個清除a的bit3。在以上兩個操作中,要保持其它位不變。

(1)把a的bit3賦值爲1:a|=(0x01<<3);//a或等於1左移3位,這樣保證其他的位不變,bit3被賦值爲1;

(2)把a的bit3清除:a&=~(0x01<<3);//a與等於(1左移3位之後取反),這樣保證其他的位不變,bit3被清除。

4.用typedef自定義的數據類型?

(1)用來定義一種類型的別名,這樣,可以用它來連續定義變量,而不是簡單的宏替換,比如:typedef char *PCHAR;PCHAR pa,pb;

(2)在C時代,定義了一個結構體之後,再使用的時候還要加上struct關鍵字才能用來定義變量,這樣會比較麻煩,而使用typedef來定義之後,就可以不用寫struct關鍵字了,比如:typedef struct tagPOINT{int x;int y;}POINT;POINT p1;當然,,C++裏可以不用這樣,因爲C++使用結構體的時候不需要加struct關鍵字;

(3)用typedef來定義與平臺無關的類型。比如你有一個跨平臺的項目,需要統一使用一種雙精度浮點型的類型,而在一些平臺上可能沒有這種實現,或者實現不同,這時候你就可以根據不同的平臺來定義你自己的類型4,用來使複雜的定義簡單化,最常用的就是給函數指針定義一個別名所以,總的來說,typedef並不是"發明"了另外一種新類型,而相當於是一種類型的別名,爲了方便使用。

5.sizeof是一個運算符,運算結果是類型的大小(內存字節數);

strlen()是一個函數,返回值爲一個字符串的長度。

6.寫出short,char,unsigned char的表示範圍?

1字節=8個位,在32位系統中一個char類型一般爲8個bit,所以能存儲的數據範圍爲-128~127,而unsigned char則是0~255,字符型所存儲的數據是用來表示字符的,例如ASCⅡ或Unicode。Signed char的範圍是-127到127,short -32767~+32768(2Bytes)。

7.編寫一個strcpy()函數

void strcpy(char *strDest, char *strSrc)

{

while((*strDest++ = *strSrc++)! = "\0");

}

推薦另一種:爲了實現鏈式操作,將目的地址返回:

char * strcpy(char *strDest, const char *strSrc)

{

assert((strDest != NULL) && (strSrc != NULL));

char *address = strDest;

while((*strDest++ = *strSrc++) != "\0");

return address;

}

8.內存的分配方式有幾種,他們的區別,各舉例。

(1)從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static變量;

(2)在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集;

(3)從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。動態內存的生存期由程序員決定,使用非常靈活,但問題也最多。

9.const的用法,以及聲明const變量與宏的區別。

const的用法有四種:參數、返回值、函數,用const修飾變量將限定變量爲只讀,該變量值不允許被改變。使用const還可以節省內存空間。define:定義預編譯時處理的宏;只進行簡單的字符替換,無類型檢測const:定義程序中的常量,編譯時處理;常量修飾符,把變量定義爲常量。

10.static有什麼用途?(至少說明兩種)

1)限制變量的作用域

2)設置變量的存儲域

11.隊列和棧有什麼區別?

棧(Stack)是限定只能在表的一端進行插入和刪除操作的線性表。隊列(Queue)是限定只能在表的一端進行插入和在另一端進行刪除操作的線性表。從"數據結構"的角度看,它們都是線性結構,即數據元素之間的關係相同。但它們是完全不同的數據類型。除了它們各自的基本操作集不同外,主要區別是對插入和刪除操作的"限定"。棧和隊列是在程序設計中被廣泛使用的兩種線性數據結構,它們的特點在於基本操作的特殊性,棧必須按"後進先出"的規則進行操作,而隊列必須按"先進先出"的規則進行操作。和線性表相比,它們的插入和刪除操作受更多的約束和限定,故又稱爲限定性的線性表結構。

12.寫出冒泡排序代碼:

13.c指令及用途:

 

14.sizeof及strlen區別:

sizeof定義:sizeof是C/C++中的一個操作符(operator),簡單的說其作用就是返回一個對象或者類型所佔的內存字節數,sizeof是一個運算符,運算結果是類型的大小(內存字節數);strlen()是一個函數,返回值爲一個字符串的長度,strlen所作的僅僅是一個計數器的工作,它從內存的某個位置開始掃描,直到碰到第一個字符串結束符'\0'爲止,然後返回計數器值。

15.寫出short,char,unsigned char的表示範圍?

 

16.(單片機)STM32的IO八種配置模式:

 

17.C指針的應用:

1.一些高級聲明:

1)int *f(void);

f是一個函數,返回值類型是一個指向整型的指針。

2)int (*f) (void);

f是一個函數指針,它所指向的函數返回值類型是一個整型值。

3)int *(*f) (void);

f是一個函數指針,它所指向的函數返回值是一個整型指針,只有對其進行間接訪問,才能得到一個整型值。

4)int *f[];

f是一個數組,它的元素類型是指向整型的指針(指針數組)。

5)int (*f[]) (void);

f是一個數組,數組元素的類型是函數指針,它所指向的函數返回值是整型值。

6)int *(*f[]) (void);

f是一個數組,數組元素的類型是函數指針,它所指向的函數返回值是指向整型的指針。

2.函數名

函數名被使用時總是由編譯器把它轉換成函數指針。

18.(硬件)選擇電阻時要考慮什麼?

選擇電阻是需要考慮電阻的功率阻值允許加載在其兩端的最大電壓允許通過的最大電流等等.

19.(單片機)單片機上電後沒有運轉,首先要檢查什麼?

1)電源,查看單片機各引腳電壓值是否正確;

2)查看晶振是否正常工作,可以用示波器查看;

3)查看最小系統有無接錯,斷路等毛病,用萬用表。

20.(Linux)簡述嵌入式Linux系統的初始化過程。

嵌入式Linux系統開機首先運行BootLoader,然後由BootLoader引導啓動內核,由內核檢查和初始化硬件設備,載入設備的驅動程序模塊,安裝root文件系統,然後內核將啓動一個名爲init的進程。在init運行完成並啓動其它必要的後續進程後,系統開始運行,引導過程結束。init進程啓動時需要讀取inittab配置文件,該文件確定init在系統啓動和關機時的工作特性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章