c中的const與c++中的const
阿新 • • 發佈:2018-12-09
c中的const是一個偽只讀識別符號。
#include <stdio.h>
#include <stdlib.h>
int main()
{
const int a = 10;
int *p = &a;
*p = 20;
printf("%d\n",a);
return 0;
}
此時輸出a的值為20,被指標間接的改變了。
c++中,const進行了增強,不在是一個偽識別符號了。
const int a = 10;
int *p = (int *)&a;
*p = 20;
cout << a << *p << endl;
cout << &a << endl;
cout<< p;
輸出:
a :10;
*p :20;
兩者的地址是一樣的。
那麼問題來了,既然兩者所指向的地址是一樣的,那為什麼內容不一樣呢?請繼續往下看。
c++編譯器引入了一個符號表,當碰見常量宣告時,在符號表中存放常量,那麼如何解釋取地址呢?
編譯過程中若發現使用常量則直接以符號表中的值替換編,譯過程中若發現對const使用了extern或者&操作符,則給對應的常量分配儲存空間。
結論:
C語言中的const變數
C語言中const變數是隻讀變數,有自己的儲存空間
C++中的const常量
可能分配儲存空間,也可能不分配儲存空間
當const常量為全域性,並且需要在其它檔案中使用
當使用&操作符取const常量的地址
聯想 const和#define的區別
對比加深
C++中的const常量類似於巨集定義
const int c = 5; ≈ #define c 5
C++中的const常量在與巨集定義不同
const常量是由編譯器處理的,提供型別檢查和作用域檢查
巨集定義由前處理器處理,單純的文字替換
void fun1()
{
#define a 10
const int b = 20;
//#undef
}
void fun2()
{
printf("a = %d\n", a);
//printf("b = %d\n", b);
}
int main(int argc, char *argv[])
{
fun1();
fun2();
return 0;
}
a 可以在fun2中使用,而b不能在fun2中使用,說明const提供了型別和作用域的檢測。