關於c的關鍵字——const的理解和用法
const在c中的用法很靈活(相信c++中也一樣),個人感覺對之既愛又恨,有時候感覺const很好用,同時又經
常會因為它的優點而犯錯,犯錯的原因除了粗心之外,另乙個更重要的,就是以前對const理解不到位。於是今天
自己寫成一篇小總結。如果是初學者,建議好好看一下,相信幫助比較大;如果是高手,請不吝賜教!
上面寫了一段廢話,就算是小序吧:)接下來就是正文;
意思,而且容易讓人產生誤解(也許是偶水平太菜了)。例如,把它有定義:乙個能夠讓變數變成無法修改的常量
的關鍵字。那麼,這樣的話,就可能讓人誤解為只要有const在定義變數裡面,那變數就無論怎樣都無法修改。這
樣的理解是很片面的(下面用法方面將對這問題做**)。因此,本人在此不敢對它下定義,其他參考書好象也沒
有下定義。
二、關於const的具體作用
——const作用就靈活了,乙個表示式中const放置的位置不同,效果可能就不一樣了。下面分具體情況分
析(當然,所舉的情況並非覆蓋全部情況)
a。const最經常的用法
1.為了防止傳遞的函式引數不被修改,在呼叫函式的形參中用const關鍵字.
//example ->
int findnum(const int array, int num, int conut);//宣告函式
//code...
int findnum(const int array, int num, int count)
}return flag;
}//code...
上面這例子中,編譯器會把array當作常量資料的陣列看待。所以,假如你不小心給陣列賦值,那麼
,編譯器就會報錯了。因此,當你不需要也不想修改陣列的資料時,最好用const把陣列定義為常量陣列。
2.const可以用來建立陣列常量、指標常量、指向常量的指標等:
const char ch = 'a';
const int a[5] = ;
const int *p = a; //a是乙個陣列的首位址.p是指向常量的指標
int * const p = a; //a是乙個陣列的首位址.p是指標常量;
const int * const p = a; //a是乙個陣列的首位址。p是指向常量的指標常量
前兩種情況很簡單,現在著重分析一下後三種用法,因為這3種情況容易出錯,偶就有時候怕用錯了
剛脆不用const.
——const int *p = a; //p是指向常量的指標,因此,不可以通過給指標賦值來改變陣列
//中的資料,例如:
// *p = 10; /*錯誤*/
// *(p + 2) = 1; /*錯誤*/
//假如指向常量指標可以改變值,那麼,就等於也改變了陣列的數
//據了。假如你不理解,偶倒有乙個辦法讓你理解,你就想你和一
//個人綁在一起,有可能你移動了位置而他不跟著你移動嗎!哈哈
——int * const p = a; //看這表示式,const的位置和第乙個不同吧!他們的用法和作用
//就完全不一樣了。這時候p是指標常量,我們知道,指標是指向
//了乙個陣列的首位址,那麼,它的位置就不可以改變了。但是你
//現在應該和第乙個表示式比較了,現在的陣列並不是常量陣列,
//所以陣列的資料是可以改變的,而指標這時候它是不可以移動的
//,指向陣列第乙個資料,所以它可以而且只可以改變陣列第乙個
//資料的值。這一點請別誤解,指標常量只是它的位址不可以改變
//,並不是它指向的內容一定不可以改變,這一點切記!
//好啦。假如你又不理解,偶又有乙個比較形象的例子來說明:
//假如有乙個固定的人拉著另外乙個人的手,注意,固定的人相當
//於他是不可以由其他人來替換的。但是他可以拉其他人的手啊,
//並不一定規定他必須拉同乙個人的手啊。現在你應該可以有個比
//較深的印象和理解吧:p
//下面舉幾個例子幫助理解:
// *p = 2; /*可以*/
// *(p+1) = 10; /*可以*/
// p++; /*不可以*/
——const int * const p = a; //假如前面兩種表示式的本質你理解了,這種表示式你來理解根本
//沒有問題,const現在有兩個,而且乙個const的位置是第一種情
//況的位置,第二個const是第二種情況的位置,所以這表示式的功
//能就是前兩種情況的作用總合。這裡不多說!
//下面舉幾個例子幫助理解:
// *p = 2; /*不可以*/
// *(p + 2) = 10; /*不可以*/
// p++; /*不可以*/
b。const並不會阻止引數的修改
之所以把這作為一點來談,就是因為有一些朋友可能會以為在函式引數中用了const就一定不可以改變
引數,這實際上是錯誤的理解,因為,它並不阻止引數的修改,下面舉個簡單的例子來闡述一下;
#include
#include
void changestr(const char *string);
int main(void)
void changestr(const char *string)
}//end
上面的程式把字串中的每個字元都轉換成大寫字母了。因為*string把位址給了*source,而
*source的值的改變編譯器並不干涉,可能有的編譯器會發出警告之類。上面的程式只是為了說明const並不會阻止
引數的修改,如果象上面程式那樣,個人感覺沒什麼意義,只會讓人容易混亂而已。
關於const的用法和理解本人也就只能說這麼多了,當然,很可能有更多高階或者少用的用法,由於水平
和經驗有限,確實不能再說些什麼。
三、參考文獻
——《c primer plus 5th》
讓我又愛又恨的C
上大學是我一直夢想的,可當我知道我的專業是計算機的時候,我還是很失望的。一直以來我對計算機的了解並不深,我深知這對我來說不容易。可我也絕不是乙個輕言放棄的人。我嘗試著去慢慢學習。隨後就接觸到了讓我愛恨交加的c 剛接觸時對我來說很陌生也很好奇,當親手敲出那幾行 寫著 我來了 的時候,心情是格外的激動,...
google啊 讓我又愛又恨
總是在最需要google的時候,突然返回遠端伺服器無響應,不得不進入baidu去搜尋。後來,慢慢發現,用瀏覽器不能像喜歡吃某種菜一樣,別的菜都不怎麼吃了,而是要這個瀏覽器訪問google出了問題,用 另乙個瀏覽器試試,發現結果還真不一樣。像今天提交google code 的時候,因為忘記密碼需要去找...
既愛又恨的inline block
初出茅廬,第一天實習的我就被inline block坑了,在平時的練習中從未碰到這個坑,幸虧公司的乙個熱心的小夥伴指點,我才解決。也怪我學藝不精啦。好了,來說說我是怎麼被坑的吧。ok,模擬一下場景,怎麼調都不對,愚蠢的我居然沒有去想inline block的鍋。我們從圖中可以看到中間黃色方塊的底部是...