大家好,我是知微!
正逢求職季,分享一些嵌入式面試當中經常會遇到的題目,希望這些乾貨對小夥伴們面試有用哦!
1、介紹一下static關鍵字的作用
在C語言中,static
關鍵字有幾種不同的作用,根據其用途可以大致分類如下:
- 區域性變數:當
static
用於函式內的區域性變數時,它使該變數的值在函式呼叫之間持久化,即變數在函式的多次呼叫間不會被重新初始化。它仍然只在宣告它的程式碼塊內可見。 - 全域性變數:將全域性變數宣告為
static
,可以限制其連結範圍僅限於定義該變數的檔案內部,也就是說,它不可以被其他檔案透過extern外部宣告所訪問。 - 函式:如果一個函式被宣告為
static
,它的連結範圍也將限制在其定義的檔案內。在檔案外部不可見,不能被其他檔案呼叫。 - 類成員:在物件導向的程式語言中,如C++或Java,
static
可以用來宣告靜態成員變數和成員函式。靜態成員被該類的所有例項共享,不屬於任何單獨的物件例項。靜態成員函式同樣不屬於任何單個物件,因而沒有this
指標,並且只能訪問其類的靜態成員。
2、介紹一下const關鍵字的作用
const
關鍵字在C語言中用來宣告一個常量。被const
修飾的變數在定義後不可更改。const
可以用於不同的上下文中:
- 區域性變數:標記函式內的區域性變數為常量,意味著該變數的值在其作用域內不能被改變。
- 全域性變數:用
const
修飾全域性變數,可以設定跨檔案的不可變資料。 - 指標:
const
用於指標時,可以讓指標指向的值或者指標本身的值(指向的地址)不可變。例如,const int *ptr
表示指向的int
值不可改變,而int * const ptr
表示指標ptr
的值(地址)不可更改。 - 函式引數:如果函式的引數被標記為
const
,意味著傳遞給函式的變數在函式內不會被改變,這對於引用和指標引數尤其重要,因為它告訴使用者這些引數是用來讀取而非修改的。 - 類成員:在C++中,
const
可以用於成員函式,表明該成員函式不會修改其所屬的物件。這樣的成員函式可以被一個const
物件呼叫。
3、標頭檔案中的 ifndef/define/endif 是幹什麼用的?
#ifndef
、#define
、#endif
這三個預處理指令用於防止標頭檔案重複包含。首次包含時,它會定義一個宏,如果該標頭檔案被再次包含,#ifndef
檢測到宏已定義,就會跳過標頭檔案內容,避免重複定義錯誤。
4、用變數a定義
a)一個整型數
b) 一個指向整型數的指標
c) 一個指向指標的的指標,它指向的指標是指向一個整型數
d) 一個有10個整型數的陣列
e) 一個有10個指標的陣列,該指標是指向一個整型數的:
f) 一個指向有10個整型數陣列的指標
g) 一個指向函式的指標,該函式有一個整型引數並返回一個整型數
h) 一個有10個函式指標的陣列,該指標指向一個函式,該函式有一個整型引數並返回一個整型數
a) int a;
b) int *a;
c) int **a;
d) int a[10];
e) int *a[10];
f) int ( *a)[10];
g) int ( *a)(int);
h) int ( *a[10])(int);
5、new和malloc的區別
- 型別安全:
new
是 C++ 中的運算子,它自動計算需要分配的空間大小,並返回正確的型別指標,無需型別轉換。malloc
是 C 語言中的庫函式,它需要手動計算位元組數,並返回void*
型別,使用時通常需要強制型別轉換。
- 構造/解構函式:
new
在分配記憶體的同時呼叫物件的建構函式,為物件的成員賦予初始值。malloc
僅分配記憶體,不呼叫建構函式,因此不初始化記憶體。
- 異常處理:
new
分配記憶體失敗時會丟擲異常(bad_alloc
)。malloc
分配記憶體失敗時返回NULL
。
- 匹配操作:
- 使用
new
分配的記憶體應該用delete
來釋放。 - 使用
malloc
分配的記憶體應該用free
來釋放。
- 使用
- 記憶體分配方式:
new
通常分配的是單個物件的記憶體。malloc
用來分配一段指定大小的記憶體區域,適合分配陣列形式的記憶體塊。
- 過載:
new
可以被過載以提供自定義的記憶體分配行為。malloc
不能被過載,因為它是 C 標準庫中的一個函式。
6、嵌入式系統中經常要用到無限迴圈,如何用C編寫死迴圈
- 使用
while
迴圈:
while(1) {
// 這裡放置迴圈體內的程式碼
}
- 使用
for
迴圈:
for(;;) {
// 這裡放置迴圈體內的程式碼
}
- 使用
do-while
迴圈:
do {
// 這裡放置迴圈體內的程式碼
} while(1);
- 使用
goto
語句:
LOOP_START:
// 這裡放置迴圈體內的程式碼
goto LOOP_START;
雖然 goto
方法可以實現
7、隱式轉換規則
如下程式碼的輸出結果是?為什麼?
#include <stdio.h>
int main(void)
{
unsigned int a = 6;
int b = -20;
if (a + b > 6)
printf("a+b大於6\n");
else
printf("a+b小於6\n");
return 0;
}
輸出結果
a+b大於6
解析:
因為編譯器會將有符號數b轉換成為一個無符號數,即此處 a+b
等價於 a+(unsigned int)b
。
該程式執行在32bit環境下,b的值為0xFFFFFFFF-20+1 = 4294967276
,即a+b將遠遠大於6。
C 語言按照一定的規則來進行此類運算的轉換,轉換的順序為:
double>float>unsigned long>long>unsigned int>int
8、sizeof和strlen的區別是什麼?
sizeof()
是一個運算子,而strlen()
是一個函式。sizeof()
計算的是變數或型別所佔用的記憶體位元組數,而strlen()
計算的是字串中字元的個數。sizeof()
可以用於任何型別的資料,而strlen()
只能用於以空字元 '\0' 結尾的字串。sizeof()
計算字串的長度,包含末尾的 '\0',strlen()
計算字串的長度,不包含字串末尾的 '\0'。
以上就是今天要分享的內容了!
📢你的每一次👍點贊 ⭐收藏 📝評論,都是我更新的動力,如有錯誤請留言指正,非常感謝!