《C語言深度剖析》筆記

2021-07-09 11:06:07 字數 2804 閱讀 6336

《c語言深度剖析》筆記

1.在c語言中,凡不加返回值型別限定的函式,就會被編譯器作為返

回整形處理。 

2.register 變數必須是乙個單個的值,並且其長度應小於或等於整型

的長度。而且 register 變數可能不存放在記憶體中, 所以不能用取

址運算子 「&」來獲取 register變數的位址。 

3. int main() 

printf("%d",strlen(a)); 

return 0; } 

此題看上去真的很簡單,但是卻鮮有人答對。答案是 255。別驚訝,

我們先分析分析。for迴圈內,當 i 的值為 0時,a[0]的值為-1。

關鍵就是-1在記憶體裡面如何儲存。我們知道在計算機系統中,數值

一律用補碼來表示(儲存) 。主要原因是使用補碼,可以將符號

位和其它位統一處理;同時,減法也可按加法來處理。另外,兩個

用補碼表示的數相加時,如果最高位(符號位)有進製,則進製被

捨棄。正數的補碼與其原碼一致;負數的補碼:符號位為 1,其餘

位為該數絕對值的原碼按位取反,然後整個數加 1。按照負數補碼

的規則,可以知道-1 的補碼為0xff,-2 的補碼為0xfe……當 i 的

值為127時,a[127]的值為-128,而-128是char型別資料能表示的

最小的負數。當 i 繼續增加,a[128]的值肯定不能是-129。因為這

時候發生了溢位,-129 需要 9 位才能儲存下來,而 char型別數

據只有 8 位,所以最高位被丟棄。剩下的 8 位是原來 9 位補碼

的低 8 位的值,即 0x7f。當 i 繼續增加到255的時候,-256的

補碼的低 8位為 0。然後當i增加到 256時,-257的補碼的低 8 位

全為1,即低八位的補碼為 0xff,如此又開始一輪新的迴圈……按

照上面的分析,a[0]到 a[254]裡面的值都不為 0,而 a[255]的值為 

0。strlen函式是計算字串長度的,並不包含字串最後的『\0』 。

而判斷乙個字串是否結束的標誌就是看是否遇到『\0』 。如果

遇到『\0』 ,則認為本字串結束。分析到這裡,strlen(a)的值為 

255應該完全能理解了。這個問題的關鍵就是要明白 char型別默

認情況下是有符號的,其表示的值的範圍為[-128,127],超出這個

範圍的值會產生溢位。 另外還要清楚的就是負數的補碼怎麼表示。 

弄明白了這兩點, 這個問題其實就很簡單了。 

4.case 後面只能是整型或字元型的常量或常量表示式(想想字元型

資料在記憶體裡是怎麼存的) 。 

5. 不能對 void指標進行演算法操作。 

6. return 語句不可返回指向「棧記憶體」的「指標」 ,因為該內存在

函式體結束時被自動銷毀。 

7. struct student 

{}stu; sizeof(stu)的值是多少呢?是1。即空結構體的大小就定位 1 

個byte。 

8. 編譯器會將注釋剔除,但不是簡單的剔除,而是用空格代替原來

的注釋。 

9. 注意:/*…*/這種形式的注釋不能巢狀,因為/*總是與離它最近的

*/匹配。 

10.const修飾的唯讀變數不能用來作為定義陣列的維數, 

也不能放在 case關鍵字後面。 

11. c語言裡(\)表示斷行。以反斜槓反斜槓之後不能有空格,反斜

槓的下一行之前也不能有空格。 

12. 注釋先於預處理指令被處理。因此,試圖用巨集開始或結束一段 

注釋是不行的。 

13.在32位系統下,不管什麼樣的指標型別,其大小都為 4byte。 

14. 往記憶體 0x12ff7c位址上存入乙個整型數 0x100,可以用下面的方

法:int *p = (int *)0x12ff7c; 

*p = 0x100; 

或者直接這麼寫**:*(int *)0x12ff7c = 0x100; 

15. int a[5];a作為右值時,代表陣列首元素的首位址,而非陣列的首

位址。 

16.以指標的形式訪問陣列; 

如:#include

void main()  } 

17. 以下標的形式訪問指標; 

如:#include

void main()  } 

18. 對指標進行加1操作,得到的是下乙個元素的位址,乙個型別為

t的指標的移動,以 sizeof(t) 為移動單位。 

例:#include

void main() 

; int *ptr=(int *)(&a+1); 

printf("%d,%d",*(a+1),*(ptr-1)); 

} 19. 函式本身是沒有型別的,只有函式的返回值才有型別。 

20. malloc函式的原型:(void *)malloc(int size)。malloc函式的返回值

是乙個 void型別的指標,引數為 int 型別資料。記憶體分配成功之

後,malloc函式返回這塊記憶體的首位址。你需要乙個指標來接收這

個位址。malloc函式申請的是連續的一塊記憶體。注意malloc函式

申請記憶體有可能不成功,所以我們在使用指向這塊記憶體的指標時,

必須用 if(null !=p)語句來驗證記憶體確實分配成功了。 

注意:用 malloc函式申請 0位元組時,記憶體不會返回 null指標,

而是返回乙個正常的記憶體位址。但是你卻無法使用這塊大小為 0 

的記憶體。對於這一點一定要小心,因為這時候 if(null !=p)語

句校驗將不起作用。 

C語言深度剖析筆記

1.變數定義 所謂的定義就是 編譯器 建立乙個物件,為這個物件分配一塊記憶體並給它取上乙個名字,這個名字就是我們經常所說的變數名或物件名。2.變數宣告 1.告訴編譯器,這個名字已經匹配到一塊記憶體上了,下面的 用到變數或物件是在別的地方定義的。宣告可以出現多次。2.告訴編譯器,這個名字已被預訂了,別...

C語言深度剖析筆記(二)

系統大小端模式檢測 include int checksystem t t.a 0x12345678 return t.c 0x78 int main define是編譯預處理指令,在編譯預處理時換,不作正確性檢查,不論是否正確只進行帶入替換,只有在編譯已被展開的源程式時才會發現可能的錯誤並報錯。2...

C語言深度剖析筆記2

int a 5 a作為右值時,代表陣列首元素的位址,而非陣列的首位址。sizeof a 的值為sizeof int 5 為20 sizeof a 0 的值為sizeof int 為4 sizeof a 5 為4 為什麼不報錯呢?因為函式求值是在執行的時候,而關鍵字sizeof求值是在編譯的時候.雖然...