Preface:
const在C中的用法很靈活(相信C++中也一樣),個人感覺對之既愛又恨,有時候感覺const很好用,同時又經常會因為它的優點而犯錯,犯錯的原因除了粗心之外,另一個更重要的,就是以前對const理解不到位。於是今天自己寫成一篇小總結.
關於const的具體定義:
個人感覺很難對它下一個標準的定義,因為的用法很靈活,似乎對它定義後總無法讓人能夠明白它的意思,而且容易讓人產生誤解(也許是偶水準太菜了)。例如,把它有定義:一個能夠讓變數變成無法修改的常量的關鍵字。那麼,這樣的話,就可能讓人誤解為只要有const在定義變數裡面,那變數就無論怎樣都無法修改。這樣的理解是很片面的(下面用法方面將對這問題做探討)。因此,本人在此不敢對它下定義,其他參考書好象也沒有下定義.
關於const的具體作用:
const 作用就靈活了,一個運算式中const放置的位置不同,效果可能就不一樣了。下面分具體情況分析(當然,所舉的情況並非覆蓋全部情況).
const 最經常的用法
為了防止傳遞的函數參數不被修改,在調用函數的形參中用 const 關鍵字, 底下為一個簡單範例:
- 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...
const可以用來創建陣列常量、指標常量、指向常量的指標等
前兩種情況很簡單,現在著重分析一下後三種用法,因為這3種情況容易出錯. 首先來看:
- const int *p = a;
- *p = 10; /*錯誤*/
- *(p + 2) = 1; /*錯誤*/
- int * const p = a;
下面的代碼是指標常量的使用範例:
- *p = 2; /*可以*/
- *(p+1) = 10; /*可以*/
- p++; /*不可以*/
- const int * const p = a;
- *p = 2; /*不可以*/
- *(p + 2) = 10; /*不可以*/
- p++; /*不可以*/
之所以把這作為一點來談,就是因為直覺會以為在函數參數中用了const就一定不可以改變參數,這實際上是錯誤的理解,因為,它並不阻止參數的修改,下面舉個簡單的例子來闡述一下:
- #include
- #include
- void ChangeStr(const char *String);
- int main(void)
- {
- char str[] = "The C programme";
- ChangeStr(str);
- printf(str);
- system("Pause");
- return 0;
- }
- void ChangeStr(const char *String)
- {
- char *Source = (char *)String;
- while (*Source)
- {
- *Source = toupper(*Source);
- Source++;
- }
- }
- //end
Supplement:
* CProgramming.com > Const Correctness
沒有留言:
張貼留言