- 普通非指針變量與const的情況
const int a = 3;
a = 4; // 錯(cuò)誤侨拦,a初始化后不能再重新賦值
- 指針變量指向的內(nèi)容不能被修改
這是比較常見的情況踊挠,就是在指針類型前或者后面加上const旁蔼,比如對(duì)于int型指針,就在int前面或者后面加上const
const int *p;
// int const *p; // 在int前后緊跟const磕潮,這表示p指向的那個(gè)int型數(shù)據(jù)不能改變,但是p本身的指向是可以變的
p = &y; // 正確容贝,改變指針指向沒問題
*p = 3; // 錯(cuò)誤自脯,改變指針指向的內(nèi)容不行
- 指針變量不能重新賦值
把const緊放在變量前面,*
后面
int * const p = &x; // 初始化后就不能再重新賦值了
*p = 3; // 正確斤富,還是可以通過p改變其指向的int型變量
p = &y; // 錯(cuò)誤膏潮,和上面的普通非指針變量a類似
- 指針的指針的指針...
請(qǐng)直接看總結(jié)
總結(jié)
其實(shí)不用整得這么亂七八糟的,就一點(diǎn)满力,const如果放到最前面焕参,比如const int ***a
轻纪,那么表示a[0][0][0]
是const int
類型,不能改變的數(shù)據(jù)是int類型(可以看成是const和后面的int結(jié)合到一起叠纷,但不會(huì)繼續(xù)向后面和*
結(jié)合)刻帚,所以如果要表示int*
不可以更改,那么把這個(gè)聲明該成const放到中間的方式涩嚣,const左邊表示的類型是不能修改的:int * const **a
表示a[0][0]
是int *const
類型崇众,是不能修改的,但是a[0][0][0]
的類型是int
航厚,它是可以修改的
如果進(jìn)一步要讓a[0][0][0]
也不能修改顷歌,那把聲明改成const int * const **a
或者int const * const **a
(前面說過,const寫到最前面就緊和后面的int結(jié)合到一起幔睬,表示int const
類型眯漩,int數(shù)據(jù)不能被改變)
有的時(shí)候把多層指針寫成數(shù)組的形式,其實(shí)都差不多麻顶,還是看const左邊是啥類型坤塞,比如const int a[][][]
或者int const a[][][]
表示a[0][0][0]
是const int
類型,不能改變int型數(shù)據(jù)澈蚌,int *const a[][]
表示a[0][0]
是int *const
類型摹芙,指向的int*
不能修改,但是a[0][0][0]
這個(gè)int型數(shù)據(jù)是可以修改的宛瞄。
最后浮禾,對(duì)于指針變量是const的情況,定義時(shí)需要給這個(gè)指針初始化份汗,因?yàn)楹竺娌荒茉傩薷闹赶蛄擞纾热?code>int *const p = &x;這里定義時(shí)初始化是必須的不能寫成int *const p; p = &x;
這樣兩句。