我試了一下指針不能,就像const int a=10;

在不去掉const 的前提可以改變a的值嗎?


多讀點書本,有好處的。


C語言的「常量」指的是字面值常量,例如const int a = 10;中的10。而a稱為常變數,它本質上是一個不能改變的變數。這種不能改變的特性是語法層面的,編譯器通過語法檢查來確保a沒有在代碼中被修改過。在運行時沒有任何機制確保a不被修改,它就和任何普通變數一樣。

以下兩種方式均能實現修改a(要求x86彙編):

1.

const int a = 10;
int* p = a;
*p = 0;
printf("%d", a);

2.

#include &

void __cdecl foo(const int a, int b)
{
(b)[-1] = 0;
printf("%d", a);
}

int main(void)
{
foo(10, 0);
return 0;
}

從標準來說,修改const修飾的變數的值屬於未定義行為,因此上述兩個示例代碼並不是總能奏效的,編譯器也可能選用立即數10來替換所有a出現的位置的優化策略。實際編程中,不要寫出這樣的代碼。


這取決於系統實現,但是一般的32/64位系統會設定一些page專門用來存儲常量。與變數不同,這些特殊的內存塊在第一次寫入後就被操作系統通過修改page table來設成只讀(read only),因此強行修改常量的程序即使編譯通過了,運行時也會報錯。


他只是語法上不能修改罷了,去了解一下內存管理,這個值是可以改的。


const 和是不是常量沒有任何關係。。它只是一個修飾變數的限定符


const的作用是告訴C編譯器這是個什麼東西,它修飾的是一種君子行為,不能改變,改了就要報警,至於有人要走後門,那就不管了,更別說在cpu實際運算的時候,更加管不著了


不能改變,只有變數才能變


推薦閱讀:
相关文章