C語(yǔ)言中const,指針和引用的關(guān)系
const 與指針
我們寫一段代碼來(lái)探究以下
int a = 10, b = 20; int* p1 = &a; *p1 = 100; p1 = &b; const int* p2 = &a; int const* p3 = &a; int* const p4 = &a; const int* const p5 = &a;
在上面 const int* p2;與int const* p3= &a;是等價(jià)的
const在星號(hào)的左邊,我們的const修飾的是指向能力,也就是說(shuō)我們可以改變p2的自身值,但是不能修改 *p2 的值;
int x = *p2;
*p2 = 100; // err 是錯(cuò)誤的
p2 = &b; //是正確的
const在星號(hào)的右邊,我們p4自身值不能改變,但是可以改變 *p4 的值
int x = *p4;
*p4 = 100; // 是正確的
p4 = &b; //err 是錯(cuò)誤的
而p5既不能改變自身值也不可以改變 *p5 的值
我們現(xiàn)在看下面的代碼,來(lái)探討哪一句正確哪一句錯(cuò)誤
int a = 10,b = 20;const int *p = &a; *p 不能改int *s0 = p; 使得 *p 可改 const int *s1 = p; *p不可改int * const s2 = p; *p可改 s2 不可改const int * const s3 = p;*p不可改 s3 不可改
我們對(duì)const int* p = &a;分析,可以看出const修飾使得 *p 不可以修改;繼而分析下面的代碼是否會(huì)對(duì) *p 產(chǎn)生修改
首先我們可以看出我們的 s0 s1 s2 s3 都等于 p 繼而 *s1 *s2 *s3 *p 都是a,我們之前提到過能力可以收縮,而不可以擴(kuò)展;
1.s0等價(jià)于p,而我們對(duì)*s0可以進(jìn)行修改,繼而是錯(cuò)誤的;
2.const修飾 *s1,所以我們無(wú)法修改 *s1,可以修改s1,繼而是正確的;
3.cosnt修飾s2,我們可以修改*s2,而不能修改s2,所以是錯(cuò)誤的;
4.我們既不可以修改s4也不可以修改 *s4 ,所以是正確的
我們?cè)賮?lái)看這樣一段代碼,這次我們將對(duì)p進(jìn)行const修飾
int a = 10,b = 20; int * const p = &a; p不能改 int *s0 = p; s0可改 *s0 == *p 可改 const int *s1 = p; *s1 不可改 s1可改 int * const s2 = p; s2不可改 *s2可改 const int * const s3 = p; s3不可改 *s3不可改
我們對(duì)int* const p = &a;分析,這次我們的const修飾p,使得p的值不能修改,而 *p 可以修改,接著分析下面的代碼
首先于上面一樣, s0 s1 s2 s3 都等于 p 繼而 s1 s2 s3 p 都是a
1.s0 與 p相等,我們可以修改*p 可以修改s0,但是對(duì)p并沒有進(jìn)行修改,所以是正確的
2.const修飾 *s1,我們不能修改 *s1,可以修改s1,與p無(wú)關(guān)所以是正確的
3.const修飾 s2 ,我們不能修改 s2,可以修改*s2,與p無(wú)關(guān)所以是正確的
4.這里我們同樣既不可以修改 s3,也不可以修改 *s3,同樣與p無(wú)關(guān),所以是正確的
如果我們通過強(qiáng)制轉(zhuǎn)換使得通過常量地址改變?cè)撝?/strong>
int main()
{
const int a = 10;
int b = 0;
int *p = (int*)&a;
*p = 100;
b = a;
cout<<"a="<<a<<"b="<<b<<"*p="<<*p<<endl;
}
對(duì)于c++,我們產(chǎn)生的結(jié)果為a=10,b=10,*p=100,對(duì)于b=a,依舊給b賦值的是10

造成這樣的原因?qū)嶋H上是因?yàn)镃++編譯會(huì)將常量a進(jìn)行數(shù)值替換,繼而b=a變成了b=10,C++對(duì)于常變量當(dāng)作常量

當(dāng)使用c語(yǔ)言編譯這段代碼
int main()
{
const int a = 10;
int b = 0;
int *p = (int*)&a;
*p = 100;
b = a;
printf("a=%d b=%d *p=%d\n",a,b,*p);
return 0;
}
得到的值為a=100,b=100,*p=100
const 與引用
我們寫一段代碼來(lái)看看const 與引用的關(guān)系
int a = 10,b = 20; int *p = &a; int *s = p; int *&pref = p; //給p起了一個(gè)別命pref int &*pref = p; //錯(cuò)誤?。?!

int &*pref = p;是錯(cuò)誤的,該代碼是一個(gè)指針指向的是一個(gè)引用,是不允許編譯通過的,因?yàn)樵谡Z(yǔ)法規(guī)則上引用不具有地址,即使引用可以進(jìn)行取地址,但是是不容許這樣做的,也就是我們可以定義一個(gè)引用去引用指針,而不能定義一個(gè)指針去指向引用
const 與指針、引用
我們?cè)趯懸欢未a詳細(xì)探討
int a = 10; int *s = &a; int *&p1 = s; const int *&p2 = p; int * const &p3 = p; int * & const p4 = p;

總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語(yǔ)言控制臺(tái)實(shí)現(xiàn)打飛機(jī)小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言控制臺(tái)實(shí)現(xiàn)打飛機(jī)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
Linux頁(yè)面置換算法的C語(yǔ)言實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Linux頁(yè)面置換算法的C語(yǔ)言實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
C++多線程編程時(shí)的數(shù)據(jù)保護(hù)
這篇文章主要介紹了C++多線程編程時(shí)的數(shù)據(jù)保護(hù),作者針對(duì)C++11版本中的新特性做出了一些解說(shuō),需要的朋友可以參考下2015-07-07
C++使用fdk-aac實(shí)現(xiàn)將音頻PCM編碼成aac
mp4的音頻流通常是aac編碼,我們做音視頻采集的時(shí)候就需要將,采集的音頻PCM編碼成aac,本文就來(lái)為大家介紹一下C++如何使用fdk-aac實(shí)現(xiàn)將音頻PCM編碼成aac吧2023-11-11
C語(yǔ)言實(shí)現(xiàn)航班訂票系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)航班訂票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
c++函數(shù)指針和回調(diào)函數(shù)示例
這篇文章主要介紹了c++函數(shù)指針和回調(diào)函數(shù)示例,需要的朋友可以參考下2014-05-05

