const在c和c 中的用法

2021-08-17 22:08:33 字數 2812 閱讀 8295

下面只是針對於基本型別

對於標準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...