《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求值是在編譯的時候.雖然...