常量指針概述
前面講過 const 前置作用于變量可創(chuàng)建符號(hào)常量
也可以用 #define 宏指令實(shí)現(xiàn)。但 const 還可以創(chuàng)建數(shù)組常量、指針常量、指向常量的指針
在此后的代碼如果嘗試修改 test 數(shù)組常量,編譯將無法繼續(xù)。
指向常量的指針不能用于修改數(shù)值
比如:
第二行代碼是 p 指向 const double 的指針,這樣就無法使用 p 來修改它所指向的值
無論使用數(shù)組還是指針符號(hào)的方式來操作指針以求更變被指向的數(shù)據(jù)的值的方式都是不可取的。
但是如果這個(gè)指針附近有其他變量空間,可以通過這個(gè)常量指針指向其他地址。
此處輸出將是 2.5;
函數(shù)的常量指針參數(shù)
通常把指向常量的指針作為函數(shù)的形式參量,用于表明函數(shù)不會(huì)通過指針修改數(shù)據(jù),例如函數(shù) test()的原型聲明
常量指針賦值的問題
關(guān)于指針賦值和 const 需要注意一些規(guī)則。比如,將常量或者非常量的數(shù)據(jù)地址賦予指針是合法的,你可以獲取或者指向它,但是不能它的修改數(shù)據(jù)。
p++;//此時(shí)輸出你會(huì)發(fā)現(xiàn)任然能夠正常編譯,但是仔細(xì)查看后,輸出的是數(shù)組的第二個(gè)元素(值 5),因?yàn)?p 先取出了 p 指針指向元素元素的值,然后將指針本身自增了 1 ,自增 1 移動(dòng)了一個(gè)數(shù)據(jù)單位,指針指向了現(xiàn)在這個(gè)元素的下一個(gè)元素(如果存在的話就會(huì)輸出正常值,不存在,這將是一個(gè)垃圾值),所以指針并沒有改變指向元素的數(shù)據(jù),依然是常量指針狀態(tài)。
(p)++;//此時(shí)你更改了數(shù)據(jù),你先取出指針 p 指向的值,再把這個(gè)值加上了 1(而不是一個(gè)數(shù)據(jù)單位),但是這編譯將不會(huì)通過,因?yàn)槭遣缓戏ǖ?,你使用的是常量指針指向這個(gè)值。
一句話總結(jié),常量指針,允許被賦值,但是不能更改數(shù)據(jù)!
常量數(shù)據(jù)賦值給普通指針的問題
然而常量指針可以指向常量或者非常量數(shù)據(jù),只是不能修改。但是常量的數(shù)據(jù)是不能被指針?biāo)赶虻?,比如下面這個(gè)例子
常量和函數(shù)參量搭配使用
在函數(shù)參數(shù)定義(聲明)中,使用 const 可以保護(hù)數(shù)據(jù),防止數(shù)據(jù)被修改。并且可以讓你使用其他函數(shù)中聲明為 const 的數(shù)據(jù)(如果不在函數(shù)中使用 const 來修飾的指針(即普通指針),那么普通指針是無法指向常量數(shù)據(jù)的(出錯(cuò)),只有常量指針才能指向常量或非常量數(shù)據(jù)),但是你要不打算用指針來作為形參,而是用普通變量或者常量類型來接收數(shù)據(jù),也是可行的。
指針常量
注意,這是指針常量,而不是上面說的常量指針,這是兩個(gè)內(nèi)容,這可能有點(diǎn)繞口,但是先看下面這個(gè)例子。
之前我們用 const 來修飾一個(gè)指針整體,而不是指針本身,我們可以任意的再把指針指向其他的地址,可以對(duì)這個(gè)指針進(jìn)行增量減量數(shù)據(jù)單位以指向下一個(gè)元素地址,,可改地址只是不能修改其指向元素的數(shù)據(jù),所以這是一個(gè)常量指針。
從中文語義分析來說,常量是形容詞,指針是名詞,以指針為中心的一個(gè)偏正結(jié)構(gòu)短語(偏和正,主次關(guān)系)。這樣看,常量指針本質(zhì)是指針,常量修飾它,表示這個(gè)指針乃是一個(gè)指向常量的指針(變量),指針指向的對(duì)象是常量,那么這個(gè)對(duì)象不能被更改。( 此處內(nèi)容自網(wǎng)絡(luò))常量指針,是常量作為主語,指針修飾常量。所以常量指針,指針本身不是常量。而指針常量,指針為主語,是常量修飾指針,所以指針常量,指針本身是常量。 有點(diǎn)拗口,多讀幾遍!
指針常量是什么
用關(guān)鍵字 const 修飾本體為指針本身時(shí),我們能保護(hù)指針指向的元素地址不被更改,而內(nèi)容可被更改。這正好這和常量指針恰恰相反,剛好也說明了常量的對(duì)象不一樣。這兩個(gè)之間的區(qū)別就在于 const 的位置,比如下面這個(gè)例子。
常量指針的多種寫法
注意:以上可見,常量指針有兩種寫法,分別是 const 前置到類型聲明,另一個(gè)是 const 放置在類型聲明后,但未進(jìn)入指針聲明。本來以為這兩個(gè)寫法是存在歧義,有優(yōu)先級(jí)差異。但是經(jīng)過實(shí)際編譯器優(yōu)化后,轉(zhuǎn)為匯編分析比對(duì)。在優(yōu)化后,或者編譯后,兩個(gè)語句為等同語句,并無差異,均為聲明指針常量。
如圖:
既不可改變地址也不可改變數(shù)據(jù)的指針
有的情況下要保證數(shù)據(jù)不可變動(dòng),這包括了指針指向地址和指向地址的內(nèi)容都不可更改。那么我們只需要結(jié)合常量指針和指針常量即可。
用兩個(gè) const 來構(gòu)造聲明指針,這個(gè)指針既不可以更改所指向的地址,也不可以更改被指向地址所存儲(chǔ)的數(shù)據(jù)。確保了數(shù)據(jù)的安全。比如:
最后的安利
異步社區(qū)是一個(gè)有氛圍并且資源豐富的IT專業(yè)圖書社區(qū),在這里可以讀到最新、最熱的IT類圖書!我想要社區(qū)的《操作系統(tǒng)真象還原》
最后的安利
異步社區(qū)是一個(gè)有氛圍并且資源豐富的IT專業(yè)圖書社區(qū),在這里可以讀到最新、最熱的IT類圖書!我想要社區(qū)的《操作系統(tǒng)真象還原》
聯(lián)系客服