1.簡述makefile的作用
makefile檔案和make工具一起使用,用於控制工程專案的編譯和鏈結,也可以用來編寫手冊頁和程式的安裝。make工具用於解釋執行makefile檔案中的內容。makefile檔案中通常包含原始檔和目標檔案的依賴關係以及從原始檔生成目標檔案的規則。make工具可以根據makefile判斷哪些檔案需要被重新編譯,目標檔案的構建順序等。
makefile:2.sizeof與strlen的區別:1.需要生成的目標檔案
2.生成目標檔案所需要的依賴檔案
3.生成目標檔案的編譯規則命令列
strlen 是函式, 測量的是字元的實際長度,以'\0' 結束。sizeof 是運算子,測量的是乙個變數或者型別的大小。
3.什麼是野指標?如何避免野指標。
產生原因:1.定義乙個指標變數時沒有初始化
2.動態分配記憶體空間後用free()釋放記憶體空間,但沒有將指標置為空指標
3.對指標的操作超出了指標變數的作用域
危害:1.指向不可訪問的地——>段錯誤
2.指向乙個可用的,但無明確意義的空間——>程式正常執行,但有隱患
3.指向乙個可用的,而且正在被使用的空間——>突然被改變,程式執行會有影響,程式會崩潰,資料被破壞
如何避免:對指標進行初始化
1.將指標置為null
2.用malloc分配記憶體(注意:檢查是否分配成功)
3.用已有合法的可訪問的記憶體位址對指標初始化
4.c語言分配記憶體的方式有哪些?
c語言中常見的記憶體錯誤有哪些?
1.從靜態儲存區域分配:全域性變數,用static 定義的變數。(存在於整個程式的執行期間)
2.從棧上建立:函式內的區域性變數函式。(隨函式結束自動釋放)
3.從堆上建立:用malloc或者new申請的記憶體空間。(用free或者delete釋放)
5.static全域性變數與普通變數的區別?
static區域性變數與普通區域性變數的區別?
static函式與普通函式的區別?
1.static全域性變數與普通變數的區別:static全域性變數和普通全域性變數的儲存方式相同但是作用域不同。普通全域性變數的作用域是整個源程式,當乙個源程式由多個原檔案組成時,普通全域性變數在各個原始檔中都是有效的。而static全域性變數則限制了其作用域,即只在定義該變數的原始檔內有效,在同一源程式的其它原始檔中不能使用它。
2.static區域性變數與普通區域性變數的區別:static區域性變數和普通區域性變數的儲存方式與作用域都不同。普通區域性變數只在宣告它的函式被呼叫時才會分配棧空間,並且只能在該函式內使用。而static區域性變數儲存在資料段或bss段中(靜態儲存區),並且原始檔的所有函式都可以使用它。
3.static函式與普通函式的區別:static函式與普通函式的作用域不同。普通函式的定義和宣告預設情況下是extern的,在源程式的所有檔案中可見,但static函式只是在宣告他的檔案中可見,不能被其他檔案所用。
6.#include <> 和 #include "" 有什麼區別?
1.#include< > 引用的是編譯器的類庫路徑裡面的標頭檔案。
2. #include" " 引用的是該程式目錄的相對路徑中的標頭檔案。
7.char *const p; char const *p; const char *p 三者的區別。
1.char *const p:指標p的指向不可以改變,但是指標指向的值可以改變(唯讀變數p)
2.char const *p:指標p的指向可以改變,但是指標指向的值不可以改變(唯讀位置)
3.const char *p:指標p的指向不可以改變,且指標指向的值也不可以改變。
nullptr是c++11中的關鍵字,表示空指標
null是乙個巨集定義,在c中null為(void*)0,而在c++中null為整數0
在c++中(void *)不能轉化為任意型別的指標static_cast、const_cast、reinterpret_cast、dynamic_cast即 int *p=(void*)是錯誤的
int *p=nullptr是正確的
原因:對於函式過載:若c++中 (void *)支援任意型別轉換,函式過載時將出現問題下列**中fun(null)將產生二義性
void fun(int i) ;
void fun(char *p) ;
int main()
(1)static_cast
特點:靜態轉換(編譯處理)。
應用場合:主要用於c++中內建的基本資料型別之間的轉換,但是沒有執行時型別的檢測來保證轉換的安全性。
用於基類和子類之間的指標或引用之間的轉換,這種轉換把子類的指標或引用轉換為基類表示是安全的;進行下行轉換,把積累的指標或引用轉換為子類表示時,由於沒有進行動態型別檢測,所以是不安全的。
把void型別的指標轉換成目標型別的指標(不安全)。
不能用於兩個不相關的型別轉換。
不能把const物件轉換成非const物件。
(2)const_cast
特點:去常轉換(編譯時)。
應用場合:const_cast操作不能在不同的種類間轉換。相反,它僅僅把它作用的表示式轉換成常量。它可以使乙個本來不是const型別的資料轉換成const型別的,或者把const屬性去掉。
(3)reinterpret_cast
特點: 重解釋型別轉換
應用場合:它有著和c風格強制型別轉換同樣的功能;它可以轉化任何的內建資料型別為其他的型別,同時它也可以把任何型別的指標轉化為其他的型別;它的機理是對二進位制進行重新的解釋,不會改變原來的格式。
(4)dynamic_cast < type-id > ( expression )
該運算子將expression轉換成type_id型別的物件。type_id必須是類的指標,類的引用或者空型別的指標。
如果type_id是乙個指標型別,那麼expression也必須是乙個指標型別,如果type_id是乙個引用型別,那麼expression也必須是乙個引用型別。
如果type_id是乙個空型別的指標,在執行的時候,就會檢測expression的實際型別,結果是乙個由expression決定的指標型別。
如果type_id不是空型別的指標,在執行的時候指向expression物件的指標能否可以轉換成type_id型別的指標。
在執行的時候決定真正的型別,如果向下轉換是安全的,就返回乙個轉換後的指標,若不安全,則返回乙個空指標。
主要用於上下行之間的轉換,也可以用於類之間的交叉轉換。上行轉換時和static_cast效果一樣,下行轉換時,具有檢測功能,比static_cast更安全。
下列與棧結構有關聯的是:遞迴與棧:系統的「遞迴工作棧」作為遞迴函式執行期間使用的資料儲存區。每一層遞迴所需資訊構成乙個「工作記錄」,其中包括所有的實際引數,所有的區域性變數以及上一層的返回位址。每進入一層遞迴,就產生乙個新的工作記錄壓入棧頂。陣列的定義與使用
作業系統的程序呼叫
函式的遞迴呼叫選擇結構的執行
c語言 知識點
遞迴方法 遞迴相比迴圈時間上快些,但是 遞迴比較占用空間,如果遞迴的次數超過十萬次後會導致資源占用完畢 標準的 優化技巧 消除迴圈 函式迴圈 函式 就地擴充套件 公共子表示式消除 改進暫存器分配 省略執行時對陣列邊界的檢查 迴圈不變數 移動 操作符長度消減 把指數操作符轉變為乘法操作 把乘法操作變為...
c語言知識點
2019 3 4 typedef void voidp 等同於typedef void voidp voidp a a null 即定義了乙個可以指向任何型別的指標 typedef voidpf zallback open file func of voidpf opeaque,const char...
c語言知識點
關於 va args define debug level,format,if level g printlevel else 這裡的 va args 表示可變引數,即上面.傳遞進來的多個引數,是當傳入引數為0時,去掉前面,防止編譯出錯 的另乙個用法如 define xname n x n,那xna...