const和指標的碰撞

2021-10-25 14:24:53 字數 2301 閱讀 3303

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的指向不能改變

const修飾*p,表示指標指向的記憶體中儲存的資料不能改變

例1:

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...