CONST

定義

編輯
const修飾的數據類型是指常類型,常類型的變量或對象的值是不能被更新的。

目的

編輯
const 推出的初始目的,正是爲了取代預編譯指令,消除它的缺點,同時繼承它的優點。

主要作用

編輯
(1)可以定義const常量,具有不可變性。 
  例如:const int Max=100; Max++會產生錯誤; 
  (2)便於進行類型檢查,使編譯器對處理內容有更多瞭解,消除了一些隱患。
  例如: void f(const int i) { .........} 編譯器就會知道i是一個常量,不允許修改; 
  (3)可以避免意義模糊的數字出現,同樣可以很方便地進行參數的調整和修改。 同宏定義一樣,可以做到不變則已,一變都變!
  如(1)中,如果想修改Max的內容,只需要它修改成:const int Max=you want;即可!
(4)可以保護被修飾的東西,防止意外的修改,增強程序的健壯性。 還是上面的例子,如果在函數體內修改了i,編譯器就會報錯; 
  例如: void f(const int i) { i=10;//error! } 
  (5) 可以節省空間,避免不必要的內存分配。 例如: 
  #define PI 3.14159 //常量宏 
  const double Pi=3.14159; //此時並未將Pi放入RAM中 ...... 
  double i=Pi; //此時爲Pi分配內存,以後不再分配! 
  double I=PI; //編譯期間進行宏替換,分配內存 
  double j=Pi; //沒有內存分配 
  double J=PI; //再進行宏替換,又一次分配內存! 
  const定義常量從彙編的角度來看,只是給出了對應的內存地址,而不是像#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而#define定義的常量在內存中有若干份拷貝。 
  (6) 提高了效率。 
  編譯器通常不爲普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成爲一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。

const常量與符號常量的區別:

1)符號常量由預編譯器處理,const型變量由變量處理。

2)在編譯時符號常量已經不存在了,而const常量依然存在。

3)符號常量的作用域從定義位置開始,到源文件結束,而const型變量和一般變量一樣。

const型指針

1)指向常量的指針

關鍵字const 在最前面。它既可以指向常量,也可以指向變量,但是不能通過它修改它所指向的量。(指針可變,其所指向的內容不可變)

定義格式:const <數據類型> * <指針變量名>;

eg:

const int * p;

const int a=15;

int b;

p=&a;  //合法,p指向常量

p=&b;    //合法,p指向變量

*p=14;  //不合法,不能通過p間接地修改它所指向的量

2)指針常量

關鍵字在指針變量名之前。這種指針,不能改變指針的指向,即指針本身是常量,不允許重新賦值。必須在定義時初始化。(指針不可變,其所指向的內容可變)定義格式:<數據類型> * const <指針變量名>;

eg:

int a,b;

int * const p=&a;              //必須初始化

*p=15;  //合法,可以通過p間接訪問變量a,給其賦值。

b=*p;   //合法,可以取出p所指向的值

p=&b;   //不合法,不可以給p重新賦值

3)指向常量的指針常量

定義格式有兩個const。不能通過該指針改變它所指向的量,也不能指針本身指向。

eg:

int a,b;

const int * const p=&a;  //初始化

*p=15;   //不合法,不能通過p改變它所指向的量

p=&b;    //不合法,不可以給p重新賦值

b=*p;     //合法,取出p指向的量。

a=8;       //合法,a是獨立的,其自身操作特性不受影響

4)快速判斷const指針——看const 的位置。

const int *p;  //常量指針,const在int前面

int * const p=&b;       //指針常量,const在p前面

























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章