一般的:
const對pointer的修飾有兩種:
- const type * p/type const * p:表示指針指向的變量的值不能改變,無論指針改變為指向哪一個變量
- type * const p:表示指針的值不能改變,不能指向其它變量
值得注意的是數組,如果一個const指針指向數組,那麼這個數組都是不能通過這個指針改變的。因為無論這個指針指向哪個記憶體位址,它都是一個const指針,它指向的變量值都不能被改變
接下來讨論第一種類型的的一些問題。為友善,以下将稱之為const指針
- const指針将可以指向非const量,這樣通過指針得到的還是const的效果
- 用非const指針指向const變量是不可以的,有的編譯器會識别為error,有的會識别為warring
warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
- 将一個const指針的值賦給一個非const指針是不可以的,将會使編譯器産生一個warring或error
但是實際上編譯器檢查的是:
- 是否直接通過const指針修改值
- 是否将const指針直接賦給非const指針
如果不是通過直接指派的方式擷取到了const指針的值,并将其賦給非const指針,那麼再進行變量修改将不會産生任何問題
- 方法一:擷取一個const指針存儲的位址值并将其當作數值存儲,比如存在一個long類型的變量中,再将這個變量通過類型轉換指派給另一個非const指針,編譯器就無法識别這個過程中的危險之處。
- 方法二:連續聲明一個const變量和一個非const變量,那麼可以通過一個變量推測到另一個變量的位址。此時就可以通過指向非const變量的指針指向const變量,編譯器同樣無法檢測
多重指針:
聲明為指向值不能改變的多重指針隻會在改變其最終指向的值時報error,改變中間過程指向的地方不會産生error或warring
不能把一個非const類型的指針通過取位址指派給一個比它高一重的const指針,因為這樣可以通過這個非const指針改變最終指向的值,但是如果通過取const指針的中間位址并改變它為非const指針的值就不會産生error或warring