C語言常見問題

2021-10-19 11:06:52 字數 4726 閱讀 1459

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) 

#define min(x,y) ((x)<(y))?(x):(y)

12、break語句與continue語句有什麼區別

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編譯器不會對陣列...