const
:const
修飾的變量是隻讀的,本質仍是變量const
修飾的局部變量在棧上分配空間const
修飾的全局變量在只讀存儲區分配空間const
只在編譯期有用,在運行期無效const
不能定義真正意義上的常量const
修飾的變量不是真的常量,它只是告訴編譯器該變量不能出如今賦值符號的左邊。const
局部變量是在棧上分配空間,能夠經過指針改變這個空間裏面的值。過了編譯期,const
變量的常量特性,只讀特性就沒有了,只讀特性只在編譯期有效,運行期根本無效。const
修飾的全局變量在只讀存儲區分配空間,所以若是用指針去修改了const
修飾的全局變量,程序就會崩潰,由於修改了程序只讀存儲區中內容,大部分程序都會發生崩潰。ios
const
:C++在C的基礎上對const
進行了進化處理,具體表如今:c++
const
聲明時,在符號表中放入常量編譯過程當中也可能爲對應的常量分配存儲空間:數組
const
用在全局或者使用了static
關鍵字說明,存放在只讀數據區數據結構
extern const int i = 10; static const int i = 10; // 或者修飾全局變量 const int a =10; int main() {}
const
常量使用了&
操做符,在棧區分配空間注意:C++編譯器雖然可能爲const
常量分配空間,但不會使用其存儲空間中的值符號表是編譯過程當中產生的一種數據結構函數
#include <iostream> #include <string> using namespace std; const int i = 10; // 若是經過指針去改變i,就會出現段錯誤:嘗試修改只讀數據區數據 int main() { const int a = 5; int *p = (int *)&a; // &a, 給a標識符分配空間了,並用p指向了該空間, // 能夠經過*p訪問這個地址,可是不能經過a來訪問 *p = 10; // 不能經過指針去改變a的值 cout << a << endl; cout << *p << endl; return 0; }
C++ 中的const
常量相似於宏定義spa
const int c = 5; // 相似於 #define c 5
可是cosnt
與宏定義的區別在於:指針
const
常量是有編譯器處理cosnt
常量進行類型檢查和做用域檢查#include <stdio.h> void f() { #define a 3 const int b = 4; } void g() { printf("a = %d\n", a); // 在g函數中訪問f函數中的宏定義,徹底沒有問題 // 在預處理的時候就進行了宏替換,對編譯器來講,就是printf("a = %d\n", 3); // 宏是沒有做用域的概念 // const 定義的常量,被編譯器處理,是有做用域的,不能訪問b printf("b = %d\n", b); } int main() { const int A = 1; const int B = 2; int array[A + B] = {0}; /* C編譯 const修飾獲得的只是具備只讀特性的變量,數組的大小是由兩個變量的大小決定的, 兩個變量相加的結果須要在運行的時候才能直到,所以編譯器編譯的時候不知道這個數組長度,直接報錯 */ /* C++編譯 const是定義的真正意義上的常量,直接從符號表中取值,編譯的時候就知道A和B的值, 能夠獲得數組的長度,不會報錯 */ int i = 0; for(i=0; i<(A + B); i++) { printf("array[%d] = %d\n", i, array[i]); } f(); g(); return 0; }