const在C語言和C 中的區別

2021-09-25 04:36:45 字數 2283 閱讀 8201

對於c語言和c++熟悉的人都知道 const 這個修飾符的存在。在很多面試公司中,const 這個修飾符的面試題筆試題也是一直都有的,那對於const這個修飾符你真的了解嗎?

問到const 這個修飾符的用處,很多人都會說,用const修飾符修飾的變數表示該變數是常亮,是唯讀的,無法修改的。其實對於這樣的回答,是不準確的。

在c語言中,用const修飾的變數,其本質上還是個變數,只是它不允許作為左值存在,也就是不法對該變數進行直接賦值修改該變數,但是這不意味著該變數的值就無法修改。下面我們看一下這段**:

#include int main()

用gcc編譯器編譯執行後得到的結果是:

a = 5

a = 10

從這個結果中我們也可以看出,const修飾的變數的值在c語言中並非是無法修改的,我們可以通過指標來修改該變數的值。

#include int main()

用g++編譯器編譯執行後得到的結果是:

a = 5

a = 5

這也就是說,相同的**,用c語言和c++編譯器編譯執行後得到的結果卻不相同。

其實在c++中 ,在編譯的時候,當碰到用const修飾的變數時,編譯器是直接將變數的值和變數的符號對應起來一起存到符號表中,例如const int a = 5;在符號表中就會將a5對應起來,在編譯的過程中,當碰到printf(「a = %d\n」,a);時,為用5直接將a替換掉。在c++中,編譯器不會為a分配儲存空間,在c語言中就會為a分配儲存空間,所以在c編譯器中,就可以通過指標來改變用const修飾的變數。

我們再看一下下面的**:

#include int main()

我們只是在**中列印了指著pa的位址,用c語言和c++的編譯器編譯執行之後,答應出來的位址pa都是相同的。這是可能你會說,在c++中不是說不會為a分配位址嗎?怎麼執行後位址pa都是相同的?

在c++中,編譯器不會為const變數分配空間,只會將其對應起來存到符號表中,用到變數名的時候,直接將值替換。但是在碰到int* p = (int*)&a;這條語句的時候,在碰到&a時,這個時候會為a分配儲存空間,這個時候pa的位址相同,但是通過指標來修改a的值在c++中還是無法成功的,因為在碰到printf(「a = %d\n」,a);時,編譯器還是會直接用5a替換,而不會去分配的儲存空間的取值。

其實在c++中,const修飾的變數,在編譯的時候如果前面有extern和取位址符&時,會為變數分配儲存空間是為了相容c語言,但是在c++中,用const修飾的變數就真的無法修改它的值,可以說是常亮。但是在c語言中,const修飾的變數本質上還是變數而不是常量。這在c語言中其實也是矛盾的,因為我們想要用const定義乙個常量,但又可以通過指標來改變該常量的值。而c++為了相容c語言,所以保留了這個特性,但是卻不法修改它的值,這就是const在c語言和c++中的區別。

在c語言中

const修飾的變數是唯讀,本質上還是乙個變數,不是真正的常量

const修飾的區域性變數在棧上分配儲存空間

const修飾的全域性變數在唯讀儲存區中分配儲存空間

const在只在編譯期有用,在執行的時候沒有用

在c++中

const修飾的變數是常量放在符號表中,在編譯的過程中,如果發現常量,則直接以符號表中的值進行替換。

在編譯的過程中,如果發現以下情況,則為常量分配儲存空間:

對const常量使用了extern;

對const常量使用了取位址符&。

在這兩種情況下,雖然會為常量分配儲存空間,但是卻不會使用該儲存空間中的值。

const在C語言和C 中的區別

const在c語言和c 中的對比一 const在c語言和c 中的對比二 下面這段 在c語言中和c 中表現出不同結果 int main 環境 c語言中 c 中 結果20 10c 中的10對嗎?如果你認為沒有被修改,那麼你就錯了,這裡的10是錯誤的,printf列印的時候是在暫存器上獲取的,而記憶體中的...

const 在C語言和C 語言中的區別

const 在c語言和c 語言中的區別 1 c語言中的 const 是定義了乙個 const 變數,const 用來限定乙個變數是唯讀的,不具備寫的功能,即是不可變的 c 語言中的 const 則是定義了乙個常量 const int a 10 int arr a 在c語言中是錯誤的,因為在c語言中是...

c語言和c 中struct的區別

1.雖然長的一樣,但是本質上型別不同 c語言中 struct是使用者自定義資料型別 udt c 中struct是抽象資料型別 adt 所以下面 struct he 在c裡面實際上資料型別為 struct he 所以定義乙個結構he變數都要 帶上struct.structhe a c語言 變數方式 而...