在函數(shù)的參數(shù)傳遞中const和指針修飾關(guān)系
經(jīng)??吹胶芏嘞到y(tǒng)函數(shù)里面有const常量修飾的形參,很多都是指針類型的,const用在表示把一個(gè)變量的值確定后不允許更改的場(chǎng)合。const和指針的關(guān)系相比其他的類型的變量要
多一點(diǎn),以int*類型為例子
第一種:沒(méi)有const修飾的指針變量 ?int *p;
void?main() { ???int?a=10; ???int?b=20; ???int?*p=&a; ???printf("%dn",*p); ???(*p)++; ???printf("%dn",*p); ???p=&b; ???printf("%dn",*p); ???(*p)++; ???printf("%dn",*p); ???/**這種指針沒(méi)有用到const修飾,a,b分別是兩個(gè)變量,在沒(méi)有const修飾的情況下,p可以指向a也可以指向b ???p指向的變量地址可以更改,也可以通過(guò)*p間接訪問(wèn)的形式對(duì)所指向的變量進(jìn)行讀和更改操作*/ ???/**程序輸出結(jié)果?10?11?20?10*/ }
第二種:const位于“*”號(hào)后面,int *const p
void?main() { ???int?a=10; ???int?b=20; ???int?*const?p=&a; ???printf("%dn",*p); ???(*p)++; ???printf("%dn",*p); ??/*?p=&b; ???printf("%dn",*p); ???(*p)++; ???printf("%dn",*p);*/ ???/**這種情況下,const直接修飾p的內(nèi)容,p只能指向最初的那個(gè)變量,以后不允許更改了,這種情況下 ???可以通過(guò)p對(duì)所指向的內(nèi)容進(jìn)行讀和更改*/ ???/**程序輸出結(jié)果?10?11?*/ }
第三種:const 位于最前面 const int *p
void?main() { ???int?a=10; ???int?b=20; ???const?int?*p=&a; ???printf("%dn",*p); ??//?(*p)++; ??//?printf("%dn",*p); ???p=&b; ???printf("%dn",*p); ???//(*p)++; ???//printf("%dn",*p);*/ ???/**這種情況下,把p所指向地址存儲(chǔ)的內(nèi)容當(dāng)成常量,所以不允許通過(guò)*p對(duì)所指向的變量進(jìn)行改寫,但是可以讀 ???因?yàn)閮H僅是把地址處所存儲(chǔ)的內(nèi)容當(dāng)成常量,但是p是一個(gè)指針變量,所以可以重新賦值,指向不同變量*/ ???/**程序輸出結(jié)果?10?20?*/ }
第四種const int * const p
void?main() { ???int?a=10; ???int?b=20; ???const?int?*const?p=&a; ???printf("%dn",*p); ??//?(*p)++; ??//?printf("%dn",*p); ???/*p=&b; ???printf("%dn",*p);*/ ???//(*p)++; ???//printf("%dn",*p);*/ ???/**這種情況下,相當(dāng)于第二中和第三種的綜合,指針p當(dāng)成常量,存儲(chǔ)的地址確定后不能改變,該地址出的內(nèi)容也 ???視為常量,不允許通過(guò)間接訪問(wèn)的形式更改,但是可以直接更改,比如a=20*/ ???/**程序輸出結(jié)果?10?*/ }
合理的運(yùn)用上述關(guān)系,在函數(shù)的參數(shù)傳遞中應(yīng)用const關(guān)鍵字修飾可以減少很多可能出現(xiàn)的錯(cuò)誤,當(dāng)錯(cuò)誤發(fā)生時(shí),會(huì)給出提示。