在函數(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)行改寫(xiě),但是可以讀
???因?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ì)給出提示。





