一、const修飾的變量html
const修飾的變量是不能經過變量再次賦值而改變。 ios
1 int main{ 2 char buf[4]; 3 const int a = 0; //a不可改變 4 a = 10; //error 5 }
這個比較容易理解,編譯器直接報錯,緣由在於「a = 10;」這句話,對const修飾的變量,後面進行賦值操做。程序員
int main{ char buf[4] = {0}; const int a = 0; buf[4] = 97; //越界操做
printf(「the a is %d\n」,a); }
若是const修飾的是變量是不能被修改的話,那麼a的值必定不會改變,確定仍是0。可是在實際運行的結果中,咱們發現a的值已經變爲97了。這說明const修飾的變量a,已經被咱們程序修改了。數組
第一個例子,錯誤是在程序編譯的時候給出的,注意這裏,這個時候並無生成可執行文件,說明const修飾的變量能否修改是由編譯器來幫咱們保護了。而第二個例子裏,變量的修改是在可執行程序執行的時候修改的,說明a仍是一個變量。const修飾的變量,其實質是告訴程序員或編譯器該變量爲只讀,若是程序員在程序中顯示的修改一個只讀變量,編譯器會絕不留情的給出一個error。而對於因爲像數組溢出,隱式修改等程序不規範書寫形成的運行過程當中的修改,編譯器是無能爲力的,也說明const修飾的變量仍然是具有變量屬性的。ide
綜上說明,const修飾變量沒有改變變量表明的存儲區自己的屬性,只是從編譯器層面進行了優化,被const修飾的變量不是常量。優化
另外const也不會修改變量的生命週期和做用於。spa
二、const修飾的幾種形式 指針
const int a = 5; <==> int const a = 5; const int *p = &i; //const修飾的對象爲*p,即變量i不可變,p可變
const (int*) p = &i; //const修飾的對象爲p,p只能指向變量i的存儲區,i可變
int * const p = &i; //同上
------------------------------------------------------------------ typedef int * p_int; const p_int p = &i; //此時const修飾的是p,p不可變,i可變
三、修改const修飾的變量的值code
1)修改只讀常量 #include <stdio.h>
int main(void){ const i = 5; int *p = (int *)&i; *p = 6; printf("%d\n", i); return 0; } 2)修改指針常量 #include <stdio.h>
int main(void){ i = 5; const int *p = &i; int *q = p; *q = 6; printf("%d\n", *p); return 0; } 3)修改常量指針 #include <stdio.h>
int main(void){ int i = 5; int j = 6; const int *p = &i; printf("%p\n", p); int **q = (int **)&p; *q = &j; printf("%p\n", p); return 0; }
四、編譯器對對const修飾的變量進行優化htm
#include<iostream> using namespace std; int main(void){ const int a=10; const int * p=&a; //讓指針p指向常量a所在的內存 int * pa=const_cast<int *>(p); //強制轉換const指針爲非const *p_var=20; //往該指針所指向的內存寫20,也就是把10給覆蓋了 cout << "a=" << a << endl; cout << "&a=" <<&a <<endl; cout << "*p=" <<*p << endl; cout << "p=" << p << endl; cout << "*pa" << *pa<< endl; cout << "pa=" << pa << endl; return 0; }
http://www.cnblogs.com/TaigaCon/archive/2012/12/19/2824355.html