C陷阱與缺陷讀書筆記(二)

2022-09-10 14:51:32 字數 1658 閱讀 1313

第三章

3.1 指標與陣列

理解:

int calendar[12][31

];/*

c語言中只有一維陣列,calendar是乙個一維陣列,

該陣列含有12個陣列型別的元素,其中每個元素都

是乙個含有31個整型元素的陣列

*/int (*monthp)[31

];/*

*monthp 是乙個擁有31個整型元素的陣列,mouthp是乙個

指向這樣的陣列的指標

*/monthp =calendar;

/*monthp 將指向陣列calendar的第乙個含有元素(含有31

個整型元素的陣列)

*/for(monthp = calendar; monthp

intmonth;

for(month = 0; month<12; month++)

3.2 非陣列的指標

//

將字串s與t拼接起來

char *r;

r = malloc(strlen(s) + strlen(t) +1

);//

給r分配足夠的空間容納s,t,不要忘了最後的 '\0'

if(!r)//

必須考慮無法分配空間的情況,進行處理

strcpy(r,s);

strcat(r,t);

/*過一段時間後再使用

*/free(r); //

不要忘記釋放動態申請的空間

3.3 作為引數的陣列說明

考察char amessage 與 char *pmessage的區別:

3.5 空指標並非空字串

#define null 0

注意:當常數0被轉換為指標使用時,不可以解除引用。

eg:

if(p == (char*)0) ...          //

合法if(strcmp(p,(char*)0) == 0)... //

不合法

因為strcmp會訪問指標指向的內容。

3.6 邊界計算與不對稱邊界

「入界點」:包括在取值範圍內;

「出界點」:不包括在取值範圍內。

int a[10

],i;

for(i=0;i<10;i++)

a[i] = 0;/*

陣列的上界(第乙個出界點)是陣列元素的個數;

0是陣列下標的第乙個入界點(0在陣列下標範圍內,包括邊界點)

10是陣列下標的第乙個出界點(10不在陣列下標範圍內,不包括邊界點)

*/

3.6後續先空過,日後再補充

補充:(1).逗號表示式:

(2).對於陣列結尾之後的下乙個元素,取其位址是合法的,但讀它的值是未定義的。

3.9 整數溢位

假設a,b是兩個非負整形變數,則採用下面兩種方法可檢測是否溢位

if((unsigned)a + (unsigned)b >int_max)   //強制轉換為無符號整數

cpmplain();

if(a > int_max -b)

complain();

《C缺陷與陷阱》讀書筆記

一 為什麼很多程式設計規範上要求單字元符號兩邊用空格隔開呢?如 a 2 最好不要寫成 a 2 在 c陷阱與缺陷 中詞法陷阱部分講到 如y x p,原本想表達的意思是p指標指向除數,但實際編譯過程中,編譯器會將 理解為一段注釋的開始,編譯器將不斷地讀入字元,直到 出現為止 這一錯誤也在 c專家程式設計...

《C陷阱與缺陷》讀書筆記

如果乙個整型常數的第乙個字元是數字0,那麼該常量將被視作八進位制數。如0195相當於十進位制數141 c語言中,else始終與同一對括號內最近的未匹配的if結合。switch語句中的case語句若在結尾處無break,程式將會繼續執行下一條case語句 非陣列的指標 include char r,s...

《C陷阱與缺陷》讀書筆記2

第二章 語法陷阱 2 1 理解函式宣告 任何c變數的宣告都由兩部分組成 型別以及一組類似表示式的宣告符 declarator float g h 表示 g 與 h 是浮點表示式。因為 結合優先順序高於 g 也就是 g g是乙個函式,該函式的返回值型別為指向浮點數的指標。同理,可以得出h是乙個函式指標...