C和C 中const的區別

2021-06-29 14:19:35 字數 2497 閱讀 6787

原文出自

一.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...