const的理解和用法
const在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)
{
int i;
int flag = 1;
for (i = 0; (i < count) && flag; i++)
{
if (array[i] == num)
{
flag = 0;
break;
}
}
return flag;
}
//code...
上面這例子中,編譯器會把array[]當作常量資料的陣列看待。所以,假如你不小心給陣列賦值,那麼,編譯器就會報錯了。因此,當你不需要也不想修改陣列的資料時,最好用const把陣列定義為常量陣列。
t可以用來建立陣列常量、指標常量、指向常量的指標等:
const char ch = 'a';
const int a[5] = {1, 2, 3, 4, 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)
{
char str[] = "The C programme";
Change(str);
printf(str);
system("Pause");
return 0;
}
void ChangeStr(const char *String)
{
char *Source = (char *)String;
while (*Source)
{
*Source = toupper(*Source);
Source++;
}
}
//end
上面的程式把字串中的每個字元都轉換成大寫字母了。因為*String把地址給了*Source,而*Source的值的改變編譯器並不干涉,可能有的編譯器會發出警告之類。上面的程式只是為了說明const並不會阻止引數的修改,如果象上面程式那樣,個人感覺沒什麼意義,只會讓人容易混亂而已。
關於CONST的用法和理解本人也就只能說這麼多了,當然,很可能有更多高階或者少用的用法,由於水平
和經驗有限,確實不能再說些什麼。
-
如何在c語言中呼叫Linux指令碼
如何在c語言中呼叫Linux指令碼呢?你知道如何在c語言中呼叫Linux指令碼嗎?下面是小編為大家帶來的如何在c語言中呼叫Linux指令碼的知識,歡迎閱讀。一、引言對於沒有接觸過Unix/Linux作業系統的人來說,fork是最難理解的概念之一:它執行一次卻返回兩個值。fork函式是Unix系...
-
C語言指標的長度和型別講解
對於初學者深入理解C語言程式設計有很好的參考價值,下面是小編為大家整理的C語言指標的長度和型別講解,歡迎參考~一般來說,如果考慮應用程式的相容性和可移植性,指標的長度就是一個問題,在大部分現代平臺上,資料指標的長度通常是一樣的,與指標型別無關,儘管C標準沒有規...
-
2017年計算機二級C語言考前訓練題及答案
計算機二級對於很多考生來說還是比較有難度的,那麼怎樣順利通過二級考試呢?這就需要大家平時多練習和找方法了。以下是本站小編整理的2017年計算機二級C語言考前訓練題及答案,希望對大家有幫助!考前訓練題一1:第1題m個人的成績存放在score陣列中,請編寫函式fun,它...
-
二級C語言考試複習五要點
綜觀近幾年全國計算機等級二級基礎部分和C語言程式設計的題目,筆試中大多數考題是與大綱要求的基本內容一致的,難度不高,但內容十分廣泛,應牢固掌握。以下是小編為您帶來的二級C語言考試複習五要點,感謝您的閱讀!一、瞭解試卷,胸中有數綜觀近幾年全國計算機等級二級...
相關文章
- C++中const-cast與reinterpret-cast運算子的用法
- MySQL安裝時出現current root password的解決方法
- 會考英語閱讀理解訓練John sent for a doctor
- Connect to Idle Instance問題的解決方法
- 提示operating system not found的解決方法
- instruction的詞彙用法講解
- C語言中Static和Const關鍵字的作用
- 中石油職稱英語閱讀講解:To Be Content with One's Lot
- 理解PHP5中static和const關鍵字的差別
- 英語單詞consist的用法和辨析