C專家程式設計 二 const

2021-07-24 07:32:10 字數 1477 閱讀 4646

關鍵字const並不能把變數變成常量!在乙個符號前加上const限定符只是表示這個符號 不能被賦值。也就是它的值對於這個符號來說是唯讀的,但它並不能防止通過程式的內部(甚 至是外部)的方法來修改這個值。const最有用之處就是用它來限定函式的形參,這樣該函式 將不會修改實參指標所指的資料,但其他的函式卻可能會修改它。這也許就是c和c++中 const最一般的用法。

const可以用在資料上,如:

const int limit = 10;

這和其他語言差不多,但當你在等式兩邊加上指標,就有一定難度了:

const int * limitp = &limit ;

int i = 27;

limitp = &i;

這段**表示limitp是乙個指向常量整型的指標。這個指標不能用於修改這個整型數, 但是在任何時候,這個指標本身的值卻可以改變。這樣,它就指向了不同的位址,對它進行 解除引用(dereference)操作時會得到乙個不同的值!

const和*的組合通常只用於在陣列形式的引數中模擬傳值呼叫。它聲稱「我給你乙個指 向它的指但你不能修改它。」這個約定類似於極為常見的void *的用法,儘管在理論上 它可以用於任何情形,但通常被限制於把指標從一種型別轉換為另一種型別。

類似地,你可以取乙個const變數的位址,並且可以...(唔,我最好不要往大家的腦 袋裡灌輸這種思想)。正如ken thompson所指出的那樣,「const關鍵字可能引發一些 罕見的錯誤,只會混淆函式庫的介面。」回首往事,const關鍵字原先如果命名為readonly 就好多了。

c語言的宣告所存在的最大問題是你無法以一種人們所習慣的自然方式從左向右閱讀-一 個宣告,在ansi c引入volatile和const關鍵字後,情況就更糟糕了。由於這些關鍵字只能 出現在宣告中(而不是使用中),這就使得現今宣告形式和使用形式能完全對得上號的例子越 來越少了。那些從風格上看像是宣告,但卻沒有識別符號的東西(如形式引數宣告和強制型別 轉換)看上去顯得滑稽。如果想要把什麼東西的型別強制轉換為指向陣列的指標,就不得不 使用下面的語句來表示這個強制型別轉換:

char (*j) [20] ; /* :i是乙個指向陣列的指標,陣列內有20個char元素。

j = (char (」[20]) malloc(20);

如果把星號兩邊看上去明顯多餘的括號拿掉,**會變成非法的。

涉及指標和const的宣告可能會出現幾種不同的順序:

const int * grape;

int const * grape;

int * const grape_jelly;

在最後一種情況下,r旨針是唯讀的,而在另外兩種情況下,指標所指向的物件是唯讀的。 當然物件和指標有可能都是唯讀的,下面兩種宣告方法都能做到這一點:

const int * const grape_jam;

int const * const grape_jam;

C專家程式設計

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

C 專家程式設計

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

c專家程式設計

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