1. 關鍵字const並不能把變數變成常量,在乙個符號前加上const限定符只是表明這個符號不能被賦值。也就是說它的值對於這個符號來說是唯讀的,但它並不能防止通過程式的內部的方法來修飾這個值。const最有用之處就是用它來限定函式的形參。這樣該函式將不會修改指標所指的資料。const和*的組合通常只用於在陣列形式的引數中模擬傳值呼叫。它聲稱「我給你乙個指向它的指標,但你不能修改它」
2. 當執行算術運算時,運算元的型別如果不同,就會發生轉換,資料型別一般朝著浮點精度更高,長度更長的方向轉換,整數如果轉換為signed不會丟失資訊,就轉換為signed,否則轉換為unsigned。
3. 在c語言中,無論什麼時候,如果遇見了這樣一條語句malloc(strlen(str));幾乎可以斷定它是錯誤的,而malloc(strlen(str) + 1)才是正確的。
4. 分析程式語言缺陷的一種方法就是把所有的缺陷歸於3類:不該做的做了,該做的沒有做,該做但做得不合適。
5. 乙個『l』的nul用於結束乙個acsii字串;兩個『l』的null用於表示什麼也不指向(空指標)。
6. 定義c函式時,在預設情況下函式的名字是全域性可見的,可以在函式的名字前面加個冗餘的extern關鍵字,也可以不加,效果一樣,這個函式對於鏈結到它的目標檔案的任何東西都是可見的。如果想限制對這個函式的訪問,就必須加上static關鍵字。
7. void 作為函式的返回型別,表示不返回任何值,在指標宣告中表示通用指標型別,位於引數列表中表示沒有引數。
8. ()在函式定義中包圍形式參數列;呼叫乙個函式;改變表示式的運算次序;將值轉換為其他型別(強制型別轉換);定義帶引數的巨集;包圍sizeof操作符的運算元。
9. 逗號運算子在所有運算子中優先順序最低。例如下面這個例子:
i = 1,2;
i的最終結果將是什麼?對,我們知道逗號運算子的值就是右邊運算元的值,但在這裡,賦值運算子的優先順序更高,所以實際情況應該是:
(i= 1),2;
i賦值為1,接著執行常量2的運算,計算結果丟棄,最終,i的結果是1而不是2.
10. 對於下面這種賦值運算:
int a, b = 1, c = 2;
a = b = c;
所有的賦值符都具有右集合性,就是說表示式中最右邊的操作最先執行,然後從右邊到左依次執行。這樣,c先賦值給b,,然後b再賦值給a,最終a的值是2。
11. 「\」字元可用於對一些字元進行「轉義」,包括newline。被轉義的newline在邏輯上把下一行當做當前的延續,它可用於連線長字串。如果在「\」和回車鍵之間不小心留上一兩個空格就會出現問題,「\ 」與「\」就不一樣的。
12. 對於區域性變數的返回引用問題:
char * localized_time(char * filenamr)
由於buffer是乙個自動分配記憶體的陣列,是該函式的區域性變數。當控制流離開宣告自動變數(區域性變數)的範圍時,自動變數變自動失效,這就意味著即使返回乙個指向區域性變數的指標,由於該變數已經被銷毀,誰也不知道這個指標所指向的位址的內容是什麼。
解決思路:
1.返回乙個指向字串常量的指標;2. 使用全域性宣告的陣列;3. 使用靜態陣列static宣告; 4. 顯示分配一些記憶體malloc函式
C高階篇(非BUG的語言特性)
許多新手程式設計師經常會犯的一種錯誤,就是將 i 3 與 i 3 相互混淆,前者表示乙個賦值語句,而後者常常作為判斷的條件。還有的程式設計師想將指標指向null時,寫成了p null 這樣的話變成了什麼?不過不用擔心,這種錯誤編譯器能夠辨別。nul與null 在c語言中,nul表示乙個字串的結束,用...
C 語言特性
a1 總的原因是,加速debug版下編譯鏈結時間.用空間換時間.具體原因為下。每乙個子程式 函式體 編譯後在 段有一定的長度,為了讓了程式緊湊,所以希望各函式體連線存放,但是在除錯 修改過程中,各函式體體會頻繁的變換長度,所以呼叫函式的個相對位址,就會需要鏈結器反覆修改.為此,各個函式體 區間並不是...
c語言 常見BUG
這裡的這些小問題就是我們平時容易犯到,如果以前沒有犯過嚴加防範,反正一定要注意,這幾類很經典的.入門級 1.void test 這段 首先要知道,strncpy的用法,以及它的引數,char strncpy char dest,const char src,int n 把src所指向的字 符串中以s...