第三章
3.1 指標與陣列
理解:
int calendar[12][313.2 非陣列的指標];/*
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.3 作為引數的陣列說明將字串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); //
不要忘記釋放動態申請的空間
考察char amessage 與 char *pmessage的區別:
3.5 空指標並非空字串
#define null 0
注意:當常數0被轉換為指標使用時,不可以解除引用。
eg:
if(p == (char*)0) ... //因為strcmp會訪問指標指向的內容。合法if(strcmp(p,(char*)0) == 0)... //
不合法
3.6 邊界計算與不對稱邊界
「入界點」:包括在取值範圍內;
「出界點」:不包括在取值範圍內。
int a[103.6後續先空過,日後再補充],i;
for(i=0;i<10;i++)
a[i] = 0;/*
陣列的上界(第乙個出界點)是陣列元素的個數;
0是陣列下標的第乙個入界點(0在陣列下標範圍內,包括邊界點)
10是陣列下標的第乙個出界點(10不在陣列下標範圍內,不包括邊界點)
*/
補充:(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是乙個函式指標...