1、const修飾指標的四種形式
a. const是關鍵字,在c語言中原來修飾變數,表示這個變數是常量。
const int inum = 10; 和 int const inum = 10;的效果是一樣的。
b. const修飾指標有4種形式。區分清楚這4種即可全部理解const和指標。
1)const int *p
p是乙個指標,指向乙個int型資料,p所指向的是個常量。
(p本身不是const, 而p指向的變數是const)
2)int const *p
p是乙個指標,指向乙個int型資料,p所指向的是個常量。
(p本身不是const, 而p指向的變數是const)
int main(int argc, char* ar**)
3)int *const p
p是乙個指標,指向乙個int型資料,p本身是常量,p所指向的是個變數。
(p本身是const,p指向的變數不是const)
4)const int *const p
p是乙個指標,指向乙個int型資料,p本身是常量,p所指向的是個常量。
(p本身是const,p指向的變數也是const)
結論和記憶方法:
關於指標變數的理解,主要涉及到兩個變數,第乙個是指標變數p本身,第二個是p指向的那個變數(*p)
乙個const關鍵字只能修飾乙個變數,所以弄清楚這4個表示式的關鍵就是搞清楚const放在某個位置修飾誰的。
a. const在*前面,就表示const作用於p所指向的量。所以這個時候p所指向的是個常量。
b. const在*後面,表示p本身是個常量,但是p指向的不一定是常量。
2、const修飾變數真的不能改嗎?
a. const修飾的變數到底能不能被改,取決於編譯的環境。
b. 在gcc環境下,是可以通過間接去改的。如給出的**可以驗證。
在gcc中,const是通過編譯器在編譯的時候執行檢查來確保實現的(也就是說const型別的變數不能改是編譯錯誤不是執行時錯誤)。所以想辦法騙過編譯器,就可以修改const定義的常量,執行時不會報錯。更深層的原因是gcc把const型別的常量也放在了data段,其實和普通變數的全域性變數放在data段的實現是一樣的。只是編譯器認定這個變數是const,執行時並沒有標記const標誌,所以只要騙過了編譯器就可以修改了。
c. 在微控制器的環境下,const修飾的變數是不可以被改的。
#include
int main(int argc, char* ar**)
3、const究竟該怎麼用
const是在編譯器中實現的,編譯時檢查,並非不能騙過。大家使用const是在傳遞一種資訊,就是告訴編譯器、也告訴讀程式的人,這個編譯時不應該也不必要被修改的。
const關鍵字與指標
const關鍵字與指標 const修飾指標的4種形式 1 const.關鍵字,在c語言中用來修飾變數,表示這個變數是常量。2 const修飾指標有4種形式,區分清楚這4種即可全部理解const和指標。第一種 const int p 第二種 int const p 第三種 int const p 第四...
const 關鍵字與指標
一.入門 概念引入 定義乙個 int 型別的普通變數 val 假設它的值是 10。再定義乙個指向該變數的指標 val ptr 它儲存了 val 的位址。1 int val 10 2 int val ptr val 乙個 int 型別的變數儲存的是 int 型別的值,同理,乙個指向 int 型別的指標...
C 指標與const關鍵字
在c 中,我們經常使用const關鍵字來定義常量,這是const的基礎用法。然而,當const與指標變數結合起來時,情況就會變得稍稍複雜,下面講解const與指標變數結合的三種形式。const關鍵字在指標型別之前定義,我們稱這種情況為常量指標,形式如下 int a 10,b 20 const int...