2.const和指標之間擦除的火花
3.注意
const修飾的量不能作為左值,完成初始化後,不能修改
在c 語言中,const修飾變數稱做常變數,可以不初始化,被當做乙個變數來編譯生成指令
int
main()
結果:30 30 30
在c++中,const修飾變數稱做常量,是可以作為陣列下標的,必須初始化,所有出現const常量的地方,都被常量的初始化替換了。
int
main()
;int
*p=(
int*
)&a;
*p=30
;printf
("%d %d %d \n"
,a,*p,*(
&a))
;}
結果:20 30 20
解析:所有出現常量a的地方都被初始化的10給替換了。但是實際上a的記憶體的值已經被改變了。
注:在c++中,const修飾的量必須初始化,初始化是乙個立即數,則此變數具有常量的屬性,若是用乙個變數來進行初始化,則具有常變數的屬性。
const和一級指標結合會出現以下的情況:
const int* p; //p指向的記憶體中儲存的資料不能改變
int const* p; //含義同上
int* const p; //指標p的指向不能改變
const int* const p;
const修飾p,代表p的指向不能改變例1:const修飾*p,表示指標指向的記憶體中儲存的資料不能改變
void
test2()
解析:
對於test2函式:const修飾的是指標指向的位址的內容,此內容不能通過指標來改變,但是指標指向的位址可以改變
例2:
void
test3()
對於test3函式:const修飾的是指標本身,所以指標的指向不能改變,但是指向位址的內容可以通過指標改變。
例3:
void
test4()
結果:const
int*
int*
例1
void
test4()
分析:
將常量的位址洩漏給普通指標。
總結:int
<=== const int * //錯誤
const int
<=== int //正確
int* * <===const int** //錯誤
const int**<===int* * //錯誤
int * const <===int //正確
int
*q1=
nullptr
;int
*const q2=
nullptr
;//q2是乙個常量,不能作為左值
cout<<
typeid
(q1)
.name()
<
cout<<
typeid
(q2)
.name()
<
結果:int
*int
*
注:const 如果右邊沒有*,const不參與型別
常量不能作為左值,(直接修改常量的值)
不能把常量的位址洩漏給普通指標或者普通引用變數(間接修改常量的值)
c和c++中const的區別:
const的編譯方式不同,c中,const修飾的量被當做變數來編譯生成指令,c++中,所有出現const修飾的量的地方都被初始化的立即數給替換了。
指向const的指標和const指標
指向const的指標 int gorp 16 int chips 12 const int p snack gorp 其中p snack指向乙個const int。p snack 20 不被允許,p snack的值為const,禁止修改p snack指向的值,p snack chips 可以執行,p...
const指標和指向const物件的指標
1.有關const指標和指向const物件指標的一道題 首先要說明的是怎麼來判斷const指標還是指向const的指標 如果const後面跟的是型別,那麼const是用來修飾物件的,所以它是指向const物件的指標 但是如果const後面跟的是指標本身,那麼const是用來修飾指標的,所以它是con...
const指標和指向const物件的指標
在c 中,帶const修飾符的指標很容易混淆,做個總結 由於const物件的值不可以修改,所以不允許通過指標來改變其指向的const值,例如如下定義 const double cptr 這裡cptr是乙個指向double型別const物件的指標,const限定了cptr指標所指向的物件型別,而非cp...