1、嵌入式與單片機(jī)的區(qū)別
從軟件上,行業(yè)里經(jīng)常把芯片中不帶MMU(Memory Management Unit內(nèi)存管理單元)從而不支持虛擬地址,只能裸奔或運行RTOS(實時操作系統(tǒng),例如ucos、華為LiteOS、RT-Thread、FreeRTOS)的system,叫做單片機(jī)(例如STM32、NXP)
而把芯片自帶MMU可以支持虛擬地址,能夠跑Linux、Vxworks、WinCE、Android這樣的“高級”的system,叫做嵌入式
2、Heap(堆)和Stack(棧)的區(qū)別
Heap(堆)上的空間是手動分配和釋放的,Stack(棧)上的空間是自動分配和釋放的
3、全局變量和局部變量的區(qū)別
1、作用域不同:全局變量作用域為整個程序,局部變量的作用域為當(dāng)前語句塊;
2、內(nèi)存存儲方式:全局變量在全局?jǐn)?shù)據(jù)區(qū)(靜態(tài)數(shù)據(jù)區(qū)),局部變量存儲在棧上;
3、生命周期不同:全局變量的生命周期和程序周期一樣,局部變量隨著語句塊的結(jié)束而結(jié)束;
4、當(dāng)局部變量和全局變量同名時,優(yōu)先使用局部變量,使用全局變量是要用域成員運算符;
4、結(jié)構(gòu)體和聯(lián)合體的區(qū)別
1、結(jié)構(gòu)體和聯(lián)合體都是由不同的數(shù)據(jù)類型組成,但在任何時候,聯(lián)合體只存在一個被選中的成員,結(jié)構(gòu)體的所有成員都存在;
2、在結(jié)構(gòu)體中,各成員占有自己的存儲空間,總大小等于各成員的大小之和;
3、在聯(lián)合體中,所有成員共用一塊存儲空間,其大小等于聯(lián)合體中最大成員的大?。?/em>
5、數(shù)組和指針的區(qū)別
1、指針要么在靜態(tài)存儲區(qū),要么在棧上被創(chuàng)建。數(shù)組名對應(yīng)著一塊內(nèi)存,其容量與地址在生命周期內(nèi)保持不變;
2、指針可以隨時指向任意類型的內(nèi)存塊,它的特征是可變,比數(shù)組靈活,但也危險;
6、指針函數(shù)和函數(shù)指針的區(qū)別
1、指針函數(shù)是一個函數(shù),它返回值是一個指針;
2、函數(shù)指針是一個指針,這個指針?biāo)傅膶ο笫且粋€函數(shù);
7、常量與變量的區(qū)別
1、常量是只讀不可寫,變量可讀可寫;
2、常量必須初始化,變量可以不初始化;
3、常量不可以尋址,它的地址不可賦給非常量指針,變量可以尋址;
8、指針自增自減與變量自增自減有什么區(qū)別
指針自增自減是改變指針?biāo)傅膶ο?;變量自增自減是改變變量的值。
9、#error的作用是什么
編譯程序時,只要遇到#error就會跳出一個編譯錯誤
10、#include <file.h> 與#include “file.h”有什么區(qū)別
#include <file.h> 表示該文件存在編譯器指定的標(biāo)準(zhǔn)頭文件存放處;#include “file.h”表示該文件在用戶當(dāng)前的工作目錄下
頭文件中的 ifdef /define endif的作用:防止頭文件被重復(fù)引用。
10、常見的條件語句比較寫法
1、bool類型 if(flag)建議使用
2、int類型 if(value != 0)建議使用
3、float if( x > -EPSION && x < EPSION )建議使用
4、指針 if(p == NULL)建議使用,強調(diào)p為指針;不建議if(p == 0)會讓人誤解為int類型
11、用#define實現(xiàn)宏并求最大值最小值
#define MAX(x,y) ((x)>(y))?(x):(y) #define MIN(x,y) ((x)<(y))?(x):(y)
12、break語句與continue語句有什么區(qū)別
continue語句只能出現(xiàn)在循環(huán)語句中,表示結(jié)束本次循環(huán);break語句還可以出現(xiàn)在switch語句中,表示結(jié)束switch語句。在循環(huán)語句內(nèi)表示結(jié)束整個循環(huán)。
13、static關(guān)鍵字的作用
1、用于全局變量:表示該變量是靜態(tài)全局變量。作用域為當(dāng)前文件;
2、用于函數(shù):該函數(shù)為靜態(tài)函數(shù),只能在本文件中調(diào)用。靜態(tài)函數(shù)在內(nèi)存中只有一份,普通函數(shù)在內(nèi)存中維持一份拷貝;
3、用作局部變量:為靜態(tài)局部變量,只初始化一次。之后調(diào)用函數(shù)都是上次函數(shù)退出時的值。即改變變量的生存周期為整個程序運行的時間段內(nèi);
4、static成員函數(shù):表示這個函數(shù)屬于此類而不屬于此類的任何對象,不能訪問非靜態(tài)變量和函數(shù),該函數(shù)在該類中是唯一的。
14、const關(guān)鍵字的作用
1、修飾一般變量和數(shù)組:修飾符可在類型說明符前,也可在類型說明符后;
2、修飾常指針:
const修飾指針指向的對象,指針可變,指針指向的對象不變
const int *A;
const修飾指針指向的對象,指針可變,指針指向的對象不變
int const *A;
const修飾指針,指針不可變,指針指向的對象可變
int * const A;
15、const與宏的區(qū)別
1、編譯時刻:宏在預(yù)編譯時刻,const在編譯時刻;
2、編譯檢查:宏不會編譯檢查,const有編譯檢查
3、宏可以定義函數(shù)、方法等,const不可以
4、大量使用宏會導(dǎo)致預(yù)編譯時間過長
16、帶參宏與函數(shù)的區(qū)別
1、處理時刻不同:宏在編譯時刻,函數(shù)在運行時刻;
2、帶參宏沒有參數(shù)類型,函數(shù)具有參數(shù)類型;
3、帶參宏不分配內(nèi)存,函數(shù)需要分配內(nèi)存;
4、宏不占用運行時間,函數(shù)在調(diào)用時刻和返回時刻占用時間;
17、引用與指針的區(qū)別
1、非空區(qū)別:指針可以指向NULL,引用必須指向某個對象;
2、可修改區(qū)別:指針可以指向不同的對象,引用總是指向初始化的對象;
3、合法性區(qū)別:在使用指針之前要判斷指針是否為NULL,引用不需要判斷;
18、malloc()與colloc()的區(qū)別
1、malloc()與colloc()都是在堆上申請動態(tài)內(nèi)存空間;
2、malloc()只有一個參數(shù),即要分配內(nèi)存大?。?/em>
3、colloc()函數(shù)有兩個參數(shù),分別是元素的個數(shù)與元素的大?。?/em>
4、malloc()不能對內(nèi)存初始化,colloc()對內(nèi)存的每一位初始化為0;
19、strcpy 、sprint、 memcpy函數(shù)的區(qū)別
strcpy 函數(shù)操作的對象是字符串,完成從源字符串到目的字符串的拷貝;
sprint函數(shù)操作的對象不限于字符串,是實現(xiàn)其他數(shù)據(jù)類型吸納高字符串的轉(zhuǎn)化。方法中需要指定數(shù)據(jù)源對象的數(shù)據(jù)類型,如果源對象是字符串,也可以實現(xiàn)字符串的拷貝功能。
memcpy內(nèi)存的拷貝,實現(xiàn)將一個內(nèi)存的內(nèi)容復(fù)制到另一個內(nèi)存塊,內(nèi)存塊由首地址及長度決定。
20、strcpy函數(shù)為什么要返回char *類型
增加代碼的靈活性,方便其他函數(shù)直接調(diào)用
21、new delete與malloc free的聯(lián)系與區(qū)別
1、都是在堆上進(jìn)行動態(tài)內(nèi)存的分配與釋放;
2、new delete是C++的運算符,malloc free是函數(shù);
3、new會自動調(diào)用對象的構(gòu)造函數(shù),返回相應(yīng)的類型;
4、malloc只會申請指定大小的內(nèi)存,返回void *類型,不能初始化對象;
5、delete與new配對,會調(diào)用析構(gòu)函數(shù);
6、free與malloc配對,只是內(nèi)存的釋放,不會調(diào)用析構(gòu)函數(shù);
22、關(guān)于靜態(tài)內(nèi)存的分配和動態(tài)內(nèi)存的分配的區(qū)別及過程
1、靜態(tài)內(nèi)存的分配是在編譯時刻完成的,不占CPU資源。動態(tài)內(nèi)存的分配是在運行時刻完成的,分配與釋放占用CPU運行時間;
2、靜態(tài)內(nèi)存分配是在棧上完成的,動態(tài)內(nèi)存分配是在堆上完成的;
3、動態(tài)內(nèi)存分配需要指針或引用數(shù)據(jù)類型的支持,而靜態(tài)內(nèi)存分配不需要;
4、靜態(tài)內(nèi)存的分配是按照計劃分配的,在編譯前確定內(nèi)存塊的大??;動態(tài)內(nèi)存分配運行時按需分配;
5、靜態(tài)內(nèi)存分配是把內(nèi)存的控制權(quán)交給了編譯器;動態(tài)內(nèi)存分配是把內(nèi)存的分配交給了程序員;
6、靜態(tài)內(nèi)存分配的效率比動態(tài)分配內(nèi)存的效率高,因為動態(tài)內(nèi)存的分配與釋放需要額外的開銷;動態(tài)內(nèi)存管理水平,嚴(yán)重依賴于程序員的水平,處理不當(dāng)容易造成內(nèi)存泄漏;
23、一個短小的函數(shù)在C與C++中分別用什么實現(xiàn)
在C中用宏實現(xiàn),在C++中用內(nèi)聯(lián)函數(shù)實現(xiàn)
24、在C++程序中調(diào)用被C編譯器編譯后的函數(shù),為什么要加extern C
C++語言支持函數(shù)的重載,C語言不支持函數(shù)的重載,編譯后參數(shù)的名字不同,函數(shù)被C++編譯器編譯后產(chǎn)生的名字為函數(shù)名加參數(shù)列表類型名之類的名字。
而C編譯器編譯后產(chǎn)生的名字為函數(shù)名。
25、一個由C/C++編譯器編譯過的程序由哪幾部分組成
1、棧區(qū):由編譯器自動編譯、釋放、存儲函數(shù)參數(shù)的值、局部變量的值等,其操作方式類似于數(shù)據(jù)結(jié)構(gòu);
2、堆區(qū):由程序員分配與釋放,如果程序員沒有釋放,在程序結(jié)束時由OS釋放,存儲結(jié)構(gòu)類似于鏈表;
3、全局變量和靜態(tài)變量存儲在一起
4、文字常量區(qū):常量、字符串存放于此,程序結(jié)束后自動釋放;
5、程序代碼區(qū):存放函數(shù)的二進(jìn)制代碼