原文出自
一.c語言中的const
const是c語言中保留的乙個關鍵字,它用來限定乙個變數是唯讀的,即不可變的。程式中使用const可以在一定程度上提高程式的健壯性,但是程式中使用過多的const,可能在對**的閱讀時增加一定的難度。
(1)用const修飾一般變數
注意在c語言中,用const修飾的變數必須在宣告時進行初始化(用來修飾函式的形參除外);
如:const int n; 這種宣告方式是錯誤的
const int n=5; 正確
void fun(const int n); 正確
const char a; 錯誤
char * const p; 錯誤
const char *p;正確(注意這種為什麼是正確的),因為這裡const是修飾p指向的變數,而不是指標變數p本身
一旦乙個變數被const修飾後,在程式中除初始化外對這個變數進行的賦值都是錯誤的。
如:const int n=5;
n=3; 錯誤
(2)const與指標搭配使用
首先必須弄清楚兩個基礎概念:指標常量和常量指標
指標常量:即指標本身的值是不可改變的,而指標指向的變數的值是可以改變的;
常量指標:即指標指向的變數的值是不可改變的,而指標本身的值是可以改變的;
可以這樣去理解:因為指標本身也是乙個變數,只不過指標存放的是位址而已,而一旦指標變成了常量,即指標本身的值是不可變的,此時指標只能指向固定的儲存單元;指標一般會指向乙個變數,如果該變數成為乙個常量,那麼該變數的值就不能被修改,即常量指標,指標指向的是乙個不可變的變數。
如:
int a=3;
const int*p=&a;
int const*p1=&a;
*p=4;
a=4;
第2行和第3行是等價的;
第四行是錯誤的,因為用const限定p指向的變數的值是不可修改的,即不可通過指標p去修改變數a的值;
第五行是正確的,因為a本身沒用const進行修飾,即a本身的值是可以修改的.
int a=1;
int b=2;
const int*p;
int const*p1;
int* const p2;
int* const p3=&b
p=&a;
p1=&a;
p2=&b;
p3=&a;
第3、4、7、8行是正確的;
第5行是錯誤的,第6行是正確的,第10行是錯誤的,因為const在'*'後面,表示是來修飾指標變數本身,因此在宣告時必須進行初始化,並且在後面不能再指向其它的變數.
#includeint main(void)
編譯結果:
error c2440: 「初始化」: 無法從「const int *」轉換為「int *」
從這裡可以看出a的值被修改了,在c語言中用const去修飾整形變數a,即a的值是不可變的,不能顯式地通過賦值語句去改變a的值,
但是不代表在程式中不能通過其它方法來修改這個值。
總結:(1)在c語言中用const去修飾乙個變數,表示這個變數是唯讀的,不可通過顯式的呼叫a去修改a的值,並且此時a仍然是乙個變 量,不能等同於常量;
(2)要注意const在宣告變數時所處的位置,位置不同,在意義上可能會有很大的不同。
如果const在'*'左邊,則表示指標指向的變數的值不可變;
如果const在'*'右邊,則表示指標的值是不可變的;
二.c++中的const
c語言和c++中的const有很大區別。在c語言中用const修飾的變數仍然是乙個變數;而在c++中用const修飾過後,就變成常量了。
如:
const int n=5;
int a[n];
這種方式在c語言中會報錯,原因在於宣告陣列時陣列的長度必須為乙個constant,即常量,雖然n用const限定了,但n終究是乙個變數,因此會報錯;
但是在c++中不會報錯,因為在c++中用const修飾過後,n就已經等同於乙個常量了,因此可以通過。
又如:
#includeusing namespace std;
int main(void)
編譯結果:
e:\c++\acm\lianxi.cpp(7) : error c2440: 'initializing' : cannot convert from 'const int *' to 'int *'
這種情況在c++中是不允許的,原因在於a用const修飾後,已經成為常量了,因此是不允許被修改的,無論是顯式的更改a的值或是通過其它方法修改它的值都是不允許的。 C和C 中的const區別
合理的利用const 有以下優點 1 指標做函式引數,可以有效提高 的可讀性,減少bug 2 清楚分清引數的輸入和輸出特性。而c語言中的const,並不是真正的const,可以通過指標,間接修改const變數的值 例如 const int a 10 int p null p int a p 20 間...
C 中的const 和C中的區別
c 中的const 一 和c中的區別 c 中的const正常情況下是看成編譯期的常量,編譯器並不為const分配空間,只是在編譯的時候將期值儲存在名字表中,並在適當的時候折合在 中.所以,以下 include using namespace std int main for int i 0 i si...
const 在c和c 中的區別
c 中的const正常情況下是看成編譯期的常量,編譯器並不為const分配空間,只是在編譯的時候將期值儲存在名字表中,並在適當的時候折合在 中.所以,以下 include using namespace std int main for int i 0 i sizeof array sizeof a...