關於c語言裡面的const?
- 2021-11-14
樓上解釋的貌似不對,這個警告並不是初始化的問題:
cp 是一個指向沒有限定符的char型別的指標
cpp 是一個指向有const限定符的char型別的指標
簡單的來講,沒有限定符的char型別比有const限定符的char型別的範圍要大,限定少。所以cpp=cp正確,而cp=ccp會產生警告。
另外補充一點,*cpp所對應的char是常量,但cpp本身所對應的地址值是可以改變的。比如,ccp=cp是可以的,但是*ccp=*cp是錯誤的。
具體的可以參考《C專家程式設計》20頁。
const 這裡作用是定義一個指向const型char變數的指標,指標並不是const型,所以cpp=cp 編譯正確,cp=cpp警告是因為cp未初始化,指向不確定的空間,所以賦值給cp會警告
char *cp;
定義了一個指標變數,指向char
const char *ccp
定義了一個指標變數,指向const char。和上面不同的是,你不能修改ccp所指向的東西的值。
也就是說,像下面這樣的語句是非法的。(假定ccp已經初始化過,指向某處了),編譯器會報錯。
*ccp = ‘a’; // 試圖修改ccp所指區域。
把cp賦值給ccp是安全的。
因為cp指向一個可以讀寫的地址,而ccp保證只對那個地址讀,而不向那個地址寫。
相反,把ccp賦值給cp是不安全的。
因為ccp指向的是一個不希望被寫的區域。而cp卻沒有保證說他一定不會去寫他所指的區域。
cp的使用者完全有權利這樣做
*cp = ‘a’; // 這是完全合法的操作
但是,當他這樣做的時候,原先ccp指向的,不希望被改寫的部分,被修改了。
所以編譯器會提出警告。
這麼跟你說吧:對於Const關鍵字他有三個位置即:
const char * ccp;
char const *cpp;
//上面這兩種情況是一樣的!!
char *const cpp;
char * const cpp;
先來看最後一個,const在最後! 說明cpp這個指標是const,或說cpp是一個常量指標也就是cpp這個指標一旦被賦值後,裡面存放的地址就是一定的了,換一句話說就是說cpp永遠只能指向一個變數!
先說在C++中吧:對於char *const cpp;這行程式碼在C++中是不能被編譯的!為什麼呢??C++認為他既然是一個常指標,那麼就是說cpp裡面的值在定義後永遠不能被改變,所以必須在初始化的時候給他賦值!如:char cc; char * ui;
可以char *const cpp=&cc; 也可以char *const cpp=ui;在定義並賦初始值後cpp裡面的值就是一定的啦!cpp永遠只能指向一個地址!如果你在後面 cpp=ui;或給cpp賦任何值都是錯誤的,編譯器會告訴你,無法賦值!!只是說cpp裡面的值是固定的,也就是說cpp永遠只能指向一個變數的地址,但cpp他所指向的變數的值是可變的!如:char u=‘3’; //給字元u賦值‘3’
char *const cpp=&u;//cpp永遠只能存放u的地址!
但是u的值是可以改變的!你可以
u=‘6’;或 *cpp=‘6’;這都是可以的!!因為你改變的是u的值而不是cpp!
在C中:如果你寫char *const cpp;這是可以的!在C中,他並不需要一定要在定義的時候初始化,但是如果你不在定義時候初始化的話,以後就不能再賦值了,如果在定義時初始化,情況就跟C++中一樣了!這也說明為什麼C++比C更優秀!C ++能幫你檢測是否有這樣的沒有意義常指標,因為你在開始沒賦值,後來又不能賦值,所以這個變數也就沒有任何意義了!
char const *cpp; 或const char *cpp;
我們再來看看這種情況!從字面上就可以看到const 修飾的是( *cpp )這個整體。這種情況下如果用cpp指向了一個變數,如果又想改變該變數的值,一般有兩種方法,一種是用變數名直接修改,另一種就是用指標修改,但在此時,不能用這種型別的指標修改變數的值!!!但是透過變數名還是可以修改的!而且此時cpp的值可以變動!因為cpp並不是常量!在C和C++中情況都是一樣的!
這個問題很簡單。就是指標指向的型別的限定符的問題。
標準規定,指標指向的型別相容的條件下,左值必須具有右值所有的限定符。(記住這一句話就行了)。const 、 volatile 、restrict等就就是限定符。於是,可知
同理,