c專家程式設計

2021-08-08 07:07:54 字數 1734 閱讀 7420

近來,看了一下《c專家程式設計》這本書,還是有一點收穫吧!也許,我的水平還不適合讀這本書吧!但是,將書中的一些注意點記在這兒。

1.要使二個賦值形式合法,必須滿足一下條件:

二個運算元都是指向有限定符或者無限定符的相容型別指標,左邊指標所指向的型別必須具有右邊指標指向型別的全部限定符。

比如:char *cp;

const char *cpp;

cpp=cp;這樣就是可以的,如果cp=cpp,這樣就會報錯,因為左邊的cp不具有右邊cpp的限定符const.

2.const限定符只是表示這個符號不能被賦值,也就是說它的值對這個符號來說是唯讀的。const的最有用的地方就是用它來限定函式的形參,這樣該函式將不能修改實參指標所指的資料。

這兒當然還有乙個問題就是const的位置不同,式子所表示的意義也不同。

(1).const char *p;

(2).char const *p;

(3).char * const p;

這三個式子中1和2是一樣的意義,都表示的是指標所指向的記憶體中的資料是唯讀的,不能被修改,而這個指標中的資料可以修改,也就是這個指標可以在指向別的變數或者記憶體。

而3表示的則是另乙個意義,它表示的是這個指標中的資料(位址)是不能被修改的,而指標中的位址,也就是這個指標所指向的記憶體中的資料可以被修改。

3.還有就是關於二個函式:strlen();這個函式注意點就是它返回的只是字串的長度,這個長度中沒有包括最後的字元結束識別符號「\0」,這樣的話,就在動態申請記憶體時,使用malloc()函式時,就malloc(strlen(c)+1);c就是乙個字元指標或者字元陣列名。還有就是注意sizeof()函式的返回值是乙個無符號數,這樣看下面的乙個例子:

#include

#include

#define t (sizeof(array)/sizeof(array[0]))

int main()

;int d=-1,x;

if(d<=t-2)

printf("over");

}在這個程式執行中始終執行不了if,也就是if判斷一直是假的,這是因為sizeof的返回值是乙個無符號數,在比較的過程中-1轉化為了乙個無符號數,這樣就會是乙個特別大的數,所以為假,因為k&r c所採取的是「無符號保留原則」,就是當乙個無符號數於int或者更小的整數混合使用時,結果是無符號數。當然,這也要取決於編譯器了。

在c語言中還有乙個奇葩的函式就是字串比價函式strcmp();這個函式是當二個字串相等時,函式返回的才是0,所以,這個在使用時要注意!不過我們可以用乙個巨集定義來解決這個問題,使之符合我們的日常邏輯:

#define strcmp(a,r,b) (strcmp(a,b) r 0)

現在我們在使用時可以:

if(strcmp(s,==,"cer")){};這樣使用,s是乙個字串;

4.typedef和指標:

typedef string *pstring;

const pstring cstr;

這個cstr是什麼型別。也許很多人會搞錯,以為是const string * pstring,是乙個指向唯讀字串的指標,其實,不是這樣的,如果你這樣想的話,就是將typedef當作是乙個文字擴充套件了,注意的是,其實,宣告const pstring時就是const修飾的就是pstring的型別,這是乙個指標型別,所以,這條宣告就是指向string的唯讀指標,這個等價於:

string * const cstr;這個就是要看const究竟修飾的是什麼,離那個近的問題。

這算是本人的一點筆記吧!

C專家程式設計

說到c語言,首稱 c程式語言 這是一本入門和進修均可的書籍,值得讀三遍以上,方才有味。進修書籍如 c專家程式設計 是一本c語言較高層次的書,是成為c語言專家的必經之路。我自以為達到了一定的 程度,才開始學習這本書的。人言,c語言是一門藝術,需要多年歷練才能達到較為完善的境界,此言不虛。c語言進修書籍...

C 專家程式設計

2011.9.4 c 專家程式設計 1 容易混淆的 const 關鍵字const 並不能把乙個變數變為常量,它修飾的符號僅表示該符號的值不能被賦值,也就意味著唯讀不可寫,但它並不能防止通過程式內部 甚至外部,其它函式 的方法來修改它。const 最有用支出是用來限定函式的形參,這樣該函式不會修改實參...

c專家程式設計

pag13 關於替代庫函式 標準規定編譯器只有在違反語法規則和約束條件的情況下才能產生錯誤資訊。所有c語言標準標頭檔案中宣告的識別符號均保留,所以不能宣告乙個叫做malloc 的函式,因為在標準標頭檔案裡已經有乙個函式以此為名。但由於這個規定不是約束條件,因此可以違反他。所以可以用自己宣告的函式來替...