下面只是針對於基本型別
對於標準c來說:const修飾的變數是唯讀變數,會分配記憶體空間。但是不能作為左值直接改變。可以通過指標來改變
對於現代c編譯器來說:會做一些優化,會進入符號表。如果有對記憶體的操作出現,那麼它就不會去符號表取值,而是去記憶體中取值。這個和c++進入符號表有些不同。
對於c++來說:const int a=1;會進入符號表,就算給它分配了空間也不會去記憶體空間去取值。如果加上volatile 就會成為唯讀變數,和c一樣了。
c++中其他const唯讀變數的情況:
const int& a=1;//a是唯讀變數
int b=1;const int a =b;//a是唯讀變數
const int b=1;const int& a=b;//a是唯讀變數,而b會進入符號表。
等等情況;
1,c語言
const修飾的變數是唯讀變數,不能作為左值,不能直接賦值,但是可以通過指標去改變該變數的值
(有的書上說會進入符號表,可能編譯器的不同)
a,const修飾的是常量,會進入符號表。但是可能會分配儲存空間,只是沒有去記憶體中取值而已,下面就是這個情況。
下面是引用的情況
b,加volatile修飾 就會成為唯讀變數。與上面的程式就只是乙個volatile區別
下面是引用的情況
c,當使用字面量對const引用進行初始化時,c++編譯器會為常量值分配空間,是唯讀變數
指標不能指向引用,所以沒有指標的情況
d,使用其它變數初始化的const常量仍然是唯讀變數
引用情況
e,const引用的型別與初始化變數的型別
相同:
不同:生成乙個新的唯讀變數,其初始值與初始化變數相同
綜合例子:
int main(int argc, char *argv)
const int x = 1;
const int& rx = x;//x分配了記憶體,只是不能再記憶體裡去值,rx是唯讀變數
int& nrx = const_cast(rx);//此時rx還是唯讀變數
nrx = 5;
printf("x = %d\n", x);//1
printf("rx = %d\n", rx);//5
printf("nrx = %d\n", nrx);//5
printf("x = %p\n", &x);
printf("rx = %p\n", &rx);
printf("nrx = %p\n", &nrx);
volatile const int y = 2;//退化為唯讀變數
int* p = null;
p = const_cast(&y);
*p = 6;
printf("y = %d\n", y);//6
printf("*p = %d\n", *p);//6
const int z = y;
p = const_cast(&z);
*p = 7;
printf("z = %d\n", z);//7
printf("*p = %d\n", *p);//7
char c = 'c';
char& rc = c;
const int& trc = c;//trc為新的唯讀變數 他的值和初始化變數值一樣
rc = 'a';
printf("c = %c\n", c);//a
printf("rc = %c\n", rc);//a
printf("trc = %c\n", trc);//c
return 0;
還要囉嗦幾句:
只有字面量初始化const常量才會進入符號表, 不管他以後分不分配空間。const int a=1;
只要對const修飾的常量進行了 取位址 或者取引用,都會分配空間。但是不一定會去裡面取值
對const修飾的常量進行了 取位址 或者取引用 一定要進行強制型別轉換 。特別是賦值給普通指標或者普通引用時候,不強制型別轉換就會出錯。因為 非常指標或非常引用不能指向常量或者引用常量。
以上是我見解,可能有不嚴謹的地方,請多指教。在dev c++中測試
const 在類型別中還有很多知識點。
const在c和c 中的用法
c中const的用法總結起來主要分為以下兩種 1 在定義變數時使用 由於const常量在定義後不能被修改,所以在定義時一定要進行初始化操作 a 最簡單的用法,說明變數為乙個常變數 在以下例子裡,int 和const的先後順序可以改變的,這無所謂 const int a 100 int const b...
const在c中的用法
常量和變數的樣子完全一樣,只是常量的值不允許被修改。我們用const這個關鍵字來宣告乙個常量。例 const int a 10 int const a 10 兩種方式都可以宣告乙個常量效果是一樣的。我們也可以用const來修飾指標 const與識別符號 例 define num 20 const i...
const在c 中的用法分析
include using std cout using std endl int main 對於const char 和 char const之間的分析,如 中的const char pstring i am chinese 定義初始化後 i am chinese 這個變數為常量唯讀,如果用pst...