4 回答

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
向后讀(由順時(shí)針/螺旋規(guī)則驅(qū)動(dòng)):
int*
- 指向int的指針int const *
- 指向const int的指針int * const
- const指向int的指針int const * const
- const指向const int的指針
現(xiàn)在第一個(gè)const
可以在類(lèi)型的任何一側(cè),所以:
const int *
==int const *
const int * const
==int const * const
如果你想變得非常瘋狂,你可以做這樣的事情:
int **
- 指向int的指針int ** const
- 指向int的指針的const指針int * const *
- 指向int的const指針的指針int const **
- 指向const int指針的指針int * const * const
- 指向int的const指針的const指針...
并確保我們清楚const的含義
const int* foo;int *const bar; //note, you actually need to set the pointer //here because you can't change it later ;)
foo
是一個(gè)指向常量整數(shù)的變量指針。這使您可以更改指向的內(nèi)容,但不能更改指向的值。大多數(shù)情況下會(huì)看到C風(fēng)格的字符串,其中有一個(gè)指向a的指針const char
。您可以更改指向的字符串,但不能更改這些字符串的內(nèi)容。當(dāng)字符串本身位于程序的數(shù)據(jù)段中且不應(yīng)更改時(shí),這很重要。
bar
是一個(gè)指向可以更改的值的常量或固定指針。這就像沒(méi)有額外語(yǔ)法糖的參考。因?yàn)檫@個(gè)事實(shí),通常你會(huì)使用一個(gè)你將使用T* const
指針的引用,除非你需要允許NULL
指針。

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊
我想這里已經(jīng)回答了所有問(wèn)題,但我只想補(bǔ)充一點(diǎn),你應(yīng)該小心typedef
s!它們不僅僅是文本替換。
例如:
typedef char *ASTRING;const ASTRING astring;
類(lèi)型astring
是char * const
,而不是const char *
。這是我總是傾向于放在const
類(lèi)型右側(cè)的一個(gè)原因,而不是從一開(kāi)始。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
幾乎所有人都指出:
有什么區(qū)別const X* p
,X* const p
和const X* const p
?
你必須從右到左閱讀指針聲明。
const X* p
表示“p指向一個(gè)常數(shù)為X的X”:不能通過(guò)p更改X對(duì)象。
X* const p
表示“p是指向非const的X的const指針”:您不能更改指針p本身,但可以通過(guò)p更改X對(duì)象。
const X* const p
表示“p是指向X的常量指針”:您不能更改指針p本身,也不能通過(guò)p更改X對(duì)象。

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
常量參考:
對(duì)變量(此處為int)的引用,它是常量。我們主要將變量作為引用傳遞,因?yàn)橐玫拇笮⌒∮趯?shí)際值,但是存在副作用,這是因?yàn)樗拖駥?shí)際變量的別名。我們可能會(huì)通過(guò)完全訪問(wèn)別名來(lái)意外更改主變量,因此我們將其設(shè)置為常量以防止此副作用。
int var0 = 0;const int &ptr1 = var0;ptr1 = 8; // Errorvar0 = 6; // OK
常量指針
一旦常量指針指向變量,它就不能指向任何其他變量。
int var1 = 1;int var2 = 0;int *const ptr2 = &var1;ptr2 = &var2; // Error
指向常數(shù)的指針
一個(gè)指針,通過(guò)它可以不改變它指向的變量的值,這個(gè)指針?lè)Q為指向常量的指針。
int const * ptr3 = &var2;*ptr3 = 4; // Error
指向常量的常量指針
指向常量的常量指針是一個(gè)指針,既不能改變它指向的地址,也不能改變保存在該地址的值。
int var3 = 0;int var4 = 0;const int * const ptr4 = &var3;*ptr4 = 1; // Error ptr4 = &var4; // Error
- 4 回答
- 0 關(guān)注
- 1518 瀏覽
添加回答
舉報(bào)