1、嵌入式與微控制器的區別
從軟體上,行業裡經常把晶元中不帶mmu(memory management unit記憶體管理單元)從而不支援虛擬位址,只能裸奔或執行rtos(實時作業系統,例如ucos、華為liteos、rt-thread、freertos)的system,叫做微控制器(例如stm32、nxp)
而把晶元自帶mmu可以支援虛擬位址,能夠跑linux、vxworks、wince、android這樣的「高階」的system,叫做嵌入式
2、heap(堆)和stack(棧)的區別
heap(堆)上的空間是手動分配和釋放的,stack(棧)上的空間是自動分配和釋放的
3、全域性變數和區域性變數的區別
1、作用域不同:全域性變數作用域為整個程式,區域性變數的作用域為當前語句塊;
2、記憶體儲存方式:全域性變數在全域性資料區(靜態資料區),區域性變數儲存在棧上;
3、生命週期不同:全域性變數的生命週期和程式週期一樣,區域性變數隨著語句塊的結束而結束;
4、當區域性變數和全域性變數同名時,優先使用區域性變數,使用全域性變數是要用域成員運算子;
4、結構體和聯合體的區別
1、結構體和聯合體都是由不同的資料型別組成,但在任何時候,聯合體只存在乙個被選中的成員,結構體的所有成員都存在;
2、在結構體中,各成員占有自己的儲存空間,總大小等於各成員的大小之和;
3、在聯合體中,所有成員共用一塊儲存空間,其大小等於聯合體中最大成員的大小;
5、陣列和指標的區別
1、指標要麼在靜態儲存區,要麼在棧上被建立。陣列名對應著一塊記憶體,其容量與位址在生命週期內保持不變;
2、指標可以隨時指向任意型別的記憶體塊,它的特徵是可變,比陣列靈活,但也危險;
6、指標函式和函式指標的區別
1、指標函式是乙個函式,它返回值是乙個指標;
2、函式指標是乙個指標,這個指標所指的物件是乙個函式;
7、常量與變數的區別
1、常量是唯讀不可寫,變數可讀可寫;
2、常量必須初始化,變數可以不初始化;
3、常量不可以定址,它的位址不可賦給非常量指標,變數可以定址;
8、指標自增自減與變數自增自減有什麼區別
指標自增自減是改變指標所指的物件;變數自增自減是改變變數的值。
9、#error的作用是什麼
編譯程式時,只要遇到#error就會跳出乙個編譯錯誤
10、#include 與#include 「file.h」有什麼區別
#include 表示該檔案存在編譯器指定的標準標頭檔案存放處;#include 「file.h」表示該檔案在使用者當前的工作目錄下
標頭檔案中的 ifdef /define endif的作用:防止標頭檔案被重複引用。
10、常見的條件語句比較寫法
1、bool型別 if(flag)建議使用
2、int型別 if(value != 0)建議使用
3、float if( x > -epsion && x < epsion )建議使用
4、指標 if(p == null)建議使用,強調p為指標;不建議if(p == 0)會讓人誤解為int型別
11、用#define實現巨集並求最大值最小值
#define max(x,y) ((x)>(y))?(x):(y)12、break語句與continue語句有什麼區別#define min(x,y) ((x)<(y))?(x):(y)
continue語句只能出現在迴圈語句中,表示結束本次迴圈;break語句還可以出現在switch語句中,表示結束switch語句。在迴圈語句內表示結束整個迴圈。
13、static關鍵字的作用
1、用於全域性變數:表示該變數是靜態全域性變數。作用域為當前檔案;
3、用作區域性變數:為靜態區域性變數,只初始化一次。之後呼叫函式都是上次函式退出時的值。即改變變數的生存週期為整個程式執行的時間段內;
4、static成員函式:表示這個函式屬於此類而不屬於此類的任何物件,不能訪問非靜態變數和函式,該函式在該類中是唯一的。
14、const關鍵字的作用
1、修飾一般變數和陣列:修飾符可在型別說明符前,也可在型別說明符後;
2、修飾常指標:
const修飾指標指向的物件,指標可變,指標指向的物件不變
const int *a;const修飾指標指向的物件,指標可變,指標指向的物件不變
int const *a;const修飾指標,指標不可變,指標指向的物件可變
int * const a;15、const與巨集的區別
1、編譯時刻:巨集在預編譯時刻,const在編譯時刻;
2、編譯檢查:巨集不會編譯檢查,const有編譯檢查
3、巨集可以定義函式、方法等,const不可以
4、大量使用巨集會導致預編譯時間過長
16、帶參巨集與函式的區別
1、處理時刻不同:巨集在編譯時刻,函式在執行時刻;
2、帶參巨集沒有引數型別,函式具有引數型別;
3、帶參巨集不分配記憶體,函式需要分配記憶體;
4、巨集不占用執行時間,函式在呼叫時刻和返回時刻占用時間;
17、引用與指標的區別
1、非空區別:指標可以指向null,引用必須指向某個物件;
2、可修改區別:指標可以指向不同的物件,引用總是指向初始化的物件;
3、合法性區別:在使用指標之前要判斷指標是否為null,引用不需要判斷;
18、malloc()與colloc()的區別
1、malloc()與colloc()都是在堆上申請動態記憶體空間;
2、malloc()只有乙個引數,即要分配記憶體大小;
3、colloc()
函式有兩個引數,分別是元素的個數與元素的大小;
4、malloc()不能對記憶體初始化,colloc()對記憶體的每一位初始化為0;
19、strcpy 、sprint、 memcpy函式的區別
strcpy 函式操作的物件是字串,完成從源字串到目的字串的拷貝;
sprint函式操作的物件不限於字串,是實現其他資料型別吸納高字串的轉化。方法中需要指定資料來源物件的資料型別,如果源物件是字串,也可以實現字串的拷貝功能。
memcpy記憶體的拷貝,實現將乙個記憶體的內容複製到另乙個記憶體塊,記憶體塊由首位址及長度決定。
20、strcpy函式為什麼要返回char *型別
增加**的靈活性,方便其他函式直接呼叫
21、new delete與malloc free的聯絡與區別
1、都是在堆上進行動態記憶體的分配與釋放;
2、new delete是c++的運算子,malloc free是函式;
3、new會自動呼叫物件的建構函式,返回相應的型別;
4、malloc只會申請指定大小的記憶體,返回void *型別,不能初始化物件;
5、delete與new配對,會呼叫析構函式;
6、free與malloc配對,只是記憶體的釋放,不會呼叫析構函式;
22、關於靜態記憶體的分配和動態記憶體的分配的區別及過程
1、靜態記憶體的分配是在編譯時刻完成的,不佔cpu資源。動態記憶體的分配是在執行時刻完成的,分配與釋放占用cpu執行時間;
2、靜態記憶體分配是在棧上完成的,動態記憶體分配是在堆上完成的;
3、動態記憶體分配需要指標或引用資料型別的支援,而靜態記憶體分配不需要;
4、靜態記憶體的分配是按照計畫分配的,在編譯前確定記憶體塊的大小;動態記憶體分配執行時按需分配;
5、靜態記憶體分配是把記憶體的控制權交給了編譯器;動態記憶體分配是把記憶體的分配交給了程式設計師;
6、靜態記憶體分配的效率比動態分配記憶體的效率高,因為動態記憶體的分配與釋放需要額外的開銷;動態記憶體管理水平,嚴重依賴於程式設計師的水平,處理不當容易造成記憶體洩漏;
23、乙個短小的函式在c與c++中分別用什麼實現
在c中用巨集實現,在c++中用內聯函式實現
24、在c++程式中呼叫被c編譯器編譯後的函式,為什麼要加extern c
c++語言支援函式的過載,c語言不支援函式的過載,編譯後引數的名字不同,函式被c++編譯器編譯後產生的名字為函式名加引數列表型別名之類的名字。
而c編譯器編譯後產生的名字為函式名。
25、乙個由c/c++編譯器編譯過的程式由哪幾部分組成
1、棧區:由編譯器自動編譯、釋放、儲存函式引數的值、區域性變數的值等,其操作方式類似於資料結構;
2、堆區:由程式設計師分配與釋放,如果程式設計師沒有釋放,在程式結束時由os釋放,儲存結構類似於鍊錶;
3、全域性變數和靜態變數儲存在一起
4、文字常量區:常量、字串存放於此,程式結束後自動釋放;
5、程式**區:存放函式的二進位制**
C語言常見問題
在c語言中,有乙個 流 的概念 流可以分為兩種型別 文字流 檔案 和二進位製流 檔案 文字流是解釋性的,最長可達255個字元 二進位製流是非解釋性的,一次處理乙個字元。在用c語言程式設計的時候,我們都是用 include指令包含型別為 h 的檔案,那麼可以用該指令包含型別不為 h 的檔案嗎?答案是 ...
C語言常見問題 pdf
4.8 我看到了用指標呼叫函式的不同語法形式。到底怎麼回事?最初,乙個函式指標必須用 操作符 和一對額外的括弧 轉換為 乙個 真 正的 函式才能呼叫 int r,func fp func r fp 而函式總是通過指標進行呼叫的,所有 真正的 函式名總是隱式的退化為指 針 在表示式中,正如在初始化時一...
C語言常見問題總結
1.用 注釋 在c語言中不是好辦法,尤其是在注釋的 中原先已經有注釋存在,可能會報錯,更好的辦法是用 if 和 endif 2.如果有一些宣告需要用於幾個不同的原始檔,可以在乙個單獨的檔案編寫這些宣告,然後用 include命令把這個檔案包含到需要使用這些宣告的原始檔中 3.標準的c編譯器不會對陣列...