速看!這8道嵌入式面試題你都會嗎?
大家好,我是知微!
正逢求職季,分享一些嵌入式面試當中經常會遇到的題目,希望這些干貨對小伙伴們面試有用哦!
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'。
以上就是今天要分享的內容了!
??你的每一次??點贊 ?收藏 ??評論,都是我更新的動力,如有錯誤請留言指正,非常感謝!

浙公網安備 33010602011771號