1、const 的理解
const 是C語言的一個關鍵字,需要注意的是,const 關鍵字是把變量變為一個只讀的變量(也就是不可以作為左值),絕對不是將這個變量變為常量。也就是說經過const 修飾的變量成為只讀的變量之后,那么這個變量就只能作為右值(只能賦值給別人),絕對不能成為左值(不能接收別人的賦值)。
而 C++ 則是將 const 修飾的常量變為一個真正的常量(變量的內容不可以被修改), 這一點的區別需要進行注意。當 const 變量的時候,就將這個常量放在符號表里面,編譯的過程中發現使用了變量,那么就從符號表里面的值進行替換。
經過const 修飾的變量,在定義的時候,就要進行初始化。
const int a = 10; // 正確 const int a; // 錯誤
const 關鍵字最有用的地方是用來限定函數的形參
func(const char *ptr) { }
這樣 ,func 函數將不會修改實參指針所指的數據,但是其他的函數卻可以修改他。
const 本質上被命名為 readonly 更為合適。
2、指向const的指針
首先,是一個指針,但是這個指針是指向一個const 類型的指針。
一般:
const int *p // 一般使用這個
或者:
int const *p
第一種:首先 P 是一個指針,P所指向的內容(*P)所指向的內容是 const int 類型的。 第二種,: 首先 P 也是一個指針,指向的內容是 const int 類型的,也就是所指向的內容是是絕對不能被修改的。
一句話, P 這個地址可以隨便指,但是地址里面保存的值卻是不能改變。
3、const 指針
首先是一個指針,只不過這個指針是 const 類型的,也就是這個指針變量的地址,只能在初始化之后,就一直指向這個地址,地址所被保存的內容是可變的。
int * const p = 地址 // 因為P 所指向的地址是不能被修改的,所以必須被初始化
首先,這個P 是一個指針,而這個指針是指向了 int 類型的 const 指針。只不過地址是被固定,不能改變,但是地址所保存的數值確實可變的,比如:
*p = 3;
4、指針和內容都是不可變的
顧名思義,就是指針的地址和地址所被保存的內容都是不可變的。
const int * const p = 地址值 int const * const p = 地址值
可見 P 是一個指針,但是這個指針,前面有 const 進行修飾,所以,這個 P 指針就是一個指針常量,所以 P 的地址就被固定了,所以只能進行初始化了。 而對於 *p 而言,前面又有 const 進行修飾,所以*p 就是一個常量了,也就是 p 指向地址,地址上保存的數據是一個常量,不能被改變的。
5、理解記憶
其實就看 const 的位置。const,在指針的星號之前,那么就是指向const 的指針,也就是 *p 的內容是常量,不能被改變。
const 在星號之后的話,那么 ,就是指向 const 的指針,也就是這個指針指向的地址,不能被改變的,所以,const 指針就必須進行初始化,然后這個地址就是一直被固定住了,不能內改變的。
6、const 與 define 區別
const 是由編譯器進行處理,執行類型檢查和作用域的檢查;
define 是由預處理器進行處理,只做簡單的文本替換工作而已。