定義
編輯目的
編輯主要作用
編輯例如:const int Max=100; Max++會產生錯誤;
(2)便於進行類型檢查,使編譯器對處理內容有更多瞭解,消除了一些隱患。
例如: void f(const int i) { .........} 編譯器就會知道i是一個常量,不允許修改;
(3)可以避免意義模糊的數字出現,同樣可以很方便地進行參數的調整和修改。 同宏定義一樣,可以做到不變則已,一變都變!
如(1)中,如果想修改Max的內容,只需要它修改成:const int Max=you want;即可!
例如: 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前面