const的理解、const指針、指向const的指針


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 是由預處理器進行處理,只做簡單的文本替換工作而已。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM