先測試c語言的const:
#includeint不是指標變數的表示式,const放在型別的前後都沒關係,但是在指標變數中,const的位置就有講究了,此時要分清楚是指標變數的值是唯讀的還是指標所指向的記憶體空間是唯讀的。而且,c語言中,const是個假const:main()
#includeint執行結果顯示a的值被改變。所以,在c語言中,const不是真正的常量,只是不能直接修改而已,因此,在那些必須要常量的場合,不能用const定義的變數。比如陣列的維數,雖然在c99中支援了變長陣列,但是很多時候我們使用的都不是vla,因為vla侷限性比較大,不能初始化,還必須是區域性變數。那麼,c語言中的常量只有define和直接數字值還有就是列舉。main()
#includeenum列舉型別可以編譯通過,因為它是真正的常量。這是在沒有支援c99的前提下測試的。define自然支援就不再測試了。test
;int
main()
;
return0;
}
那麼,其實在很多時候,c語言中的**加上了const修飾,也還是不安全的。
int上述**還是會改變a的值,但這個例子一般我們不會這樣寫,不過從上面的**中,我們可能會像下面這樣寫程式,因為很多時候,我們想用const指標修飾的形參。目的是不想實參被改變,但是如果不注意,還是達不到想要的效果:main()
#includevoid test(int我們把形參的指標所指向的記憶體空間設定成const的,就是不想實參被改變,但是還是可能會被間接修改,所以,在編寫**的時候,我們不要使用上述**的const
*p)int
main()
int *p1 = p;因為就算你形參用const保護了,後續忘記了用const去接這樣的變數,還是無用的。這提醒我們注意,應該這樣去寫這句
話:int const *p1 = p;
保證接它的變數也要是const的。
c++中,const是公升級過的了:
#includeusing此時,c++不再允許我們對此進行更改,這證明了,c++中const修飾的變數是真正的常量,是不是const修飾的就如果簡單了呢?那麼我們再試試換個方式:namespace
std;
intmain()
可以清楚地看到,我們改變了a的值,這也就是說,在c++中,如果用乙個字面值給const修飾的變數賦值,例如int const a=10;這樣的a就是常量,可以用來當做陣列的維數,如果用乙個變數給const修飾的變數賦值,例如int const a=b;這樣的a就是唯讀變數,不能直接修改,但可以間接修改,和c中一樣了。
另外注意,由於c++中嚴格檢查型別匹配問題,所以我們要知道,在const修飾的指標變數中,頂層const在有賦值效果的操作中將被忽略。
const在c和c 中地位不同
先測試c語言的const includeint main 不是指標變數的表示式,const放在型別的前後都沒關係,但是在指標變數中,const的位置就有講究了,此時要分清楚是指標變數的值是唯讀的還是指標所指向的記憶體空間是唯讀的。而且,c語言中,const是個假const includeint ma...
const在c與c 中的不同地位
我們都知道,const關鍵字是防止某個變數被修改的,即限定這個變數是唯讀的。c c 中應用const會使程式的健壯性更高一些。一 const修飾一般變數 在c中,const修飾一般變數是常變數,它具有變數屬性,但同時,它又具有常性不可被修改。在c 中,加const修飾以後變數就是個常量,不可被修改。...
C 中 const 和 readonly 的不同
const 的概念就是乙個包含不能修改的值的變數。常數表示式是在編譯時可被完khrxc全計算的表示式。因此不能從乙個變數中提取的值來初始化常量。如果 const int a b 1 b是乙個變數,顯然不能再編譯時就計算出結果,所以常量是不可以用變數來初始化的。readonly 允許把乙個字段設定成常...