1、嵌入式與單片機的區(qū)別 從軟件上,行業(yè)里經(jīng)常把芯片中不帶MMU(Memory Management Unit內(nèi)存管理單元)從而不支持虛擬地址,只能裸奔或運行RTOS(實時操作系統(tǒng),例如ucos、華為LiteOS、RT-Thread、FreeRTOS)的system,叫做單片機(例如STM32、NXP) 而把芯片自帶MMU可以支持虛擬地址,能夠跑Linux、Vxworks、WinCE、Android這樣的“高級”的system,叫做嵌入式
2、Heap(堆)和Stack(棧)的區(qū)別 Heap(堆)上的空間是手動分配和釋放的,Stack(棧)上的空間是自動分配和釋放的
3、全局變量和局部變量的區(qū)別 1、作用域不同:全局變量作用域為整個程序,局部變量的作用域為當前語句塊; 2、內(nèi)存存儲方式:全局變量在全局數(shù)據(jù)區(qū)(靜態(tài)數(shù)據(jù)區(qū)),局部變量存儲在棧上; 3、生命周期不同:全局變量的生命周期和程序周期一樣,局部變量隨著語句塊的結(jié)束而結(jié)束; 4、當局部變量和全局變量同名時,優(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)合體中最大成員的大小;
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ù)指針是一個指針,這個指針所指的對象是一個函數(shù);
7、常量與變量的區(qū)別 1、常量是只讀不可寫,變量可讀可寫; 2、常量必須初始化,變量可以不初始化; 3、常量不可以尋址,它的地址不可賦給非常量指針,變量可以尋址;
8、指針自增自減與變量自增自減有什么區(qū)別 指針自增自減是改變指針所指的對象;變量自增自減是改變變量的值。
9、#error的作用是什么 編譯程序時,只要遇到#error就會跳出一個編譯錯誤
10、#include <file.h> 與#include “file.h”有什么區(qū)別 #include <file.h> 表示該文件存在編譯器指定的標準頭文件存放處;#include “file.h”表示該文件在用戶當前的工作目錄下 頭文件中的 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)全局變量。作用域為當前文件; 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)存大??; 3、colloc()函數(shù)有兩個參數(shù),分別是元素的個數(shù)與元素的大??; 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、都是在堆上進行動態(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)存管理水平,嚴重依賴于程序員的水平,處理不當容易造成內(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ù)的二進制代碼
|
|