資源描述:
《const指針和指向const指針》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、const指針和指向const的指針博客分類:·C系列?指向const對(duì)象的指針??????指向const對(duì)象的指針就是一個(gè)指針,不能通過它來修改它所指向的對(duì)象的值。聲明方法:constint*p;???????const對(duì)象在初始化后是不允許對(duì)其值進(jìn)行修改的,因此,我們不能用一個(gè)普通指針指向一個(gè)const對(duì)象,即下面的賦值會(huì)引起編譯錯(cuò)誤: constinti=1; int*p=&i;否則的話,我們就可以利用普通指針來修改一個(gè)const對(duì)象的值,那么const也就毫無意義了。正確的方法是利用一個(gè)指向const對(duì)象的指針來獲取const對(duì)象的地址:????constinti=1; ?con
2、stint*p=&i;????charconst*p==constchar*p;這樣,利用指向const對(duì)象的指針也是不能修改它所指向的const對(duì)象的值的。注意:??1.指向const對(duì)象的指針本身不是const類型(這也是它與const指針的主要不同點(diǎn)),所以它可以指向另一個(gè)const對(duì)象??2.指向const對(duì)象的指針可以被賦予一個(gè)非const對(duì)象的地址,但是此時(shí)試圖通過此指針來修改對(duì)象的值的操作是非法的?const指針?????const指針就是一個(gè)指針,它本身就是const類型,所以將它初始化后不能再改變它的指向,即不能讓它指向一個(gè)新的對(duì)象。聲明方法: int*constp;//
3、指向非const對(duì)象的const指針 constint*constp;//指向const對(duì)象的const指針使用const指針不可以修改其地址值,但是const指針指向非const對(duì)象,就可以利用它修改它所指向的對(duì)象的值技巧:????如果指針名前緊鄰的關(guān)鍵字為const,那么它就是一個(gè)const指針;如果聲明指針?biāo)赶虻膶?duì)象類型前有const關(guān)鍵字,那么它就是一個(gè)指向cosnt對(duì)象的指針。補(bǔ)充:????Bjarne在他的TheC++ProgrammingLanguage里面給出過一個(gè)助記的方法:把一個(gè)聲明從右向左讀(這可能和我們平常習(xí)慣有所不同,需要特別注意)。?????char?*con
4、stcp;(*讀成pointerto)????cpisaconstpointertochar,亦即指針常量,cp值不可改變,但*cp,也就是cp所指對(duì)象能夠改變。????constchar*p;????pisapointertoconstchar,亦即指向常量的指針,所以p所指的對(duì)象不可改變。?補(bǔ):一、可能的組合:???(1)constchar*p????(2)charconst*p???(3)char*constp???(4)constchar**p???(5)charconst**p???(6)char*const*p???(7)char**constp????當(dāng)然還有在(5)、(6)、
5、(7)中再插入一個(gè)const的若干情況,不過分析了以上7中,其他的就可類推了!二、理解助記法寶:????1。關(guān)鍵看const修飾誰。????2。由于沒有const*的運(yùn)算,若出現(xiàn)const*的形式,則const實(shí)際上是修飾前面的。????比如:charconst*p,由于沒有const*運(yùn)算,則const實(shí)際上是修飾前面的char,因此charconst*p等價(jià)于constchar*p。也就是說上面7種情況中,(1)和(2)等價(jià)。同理,(4)和(5)等價(jià)。在(6)中,由于沒有const*運(yùn)算,const實(shí)際上修飾的是前面的char*,但不能在定義時(shí)轉(zhuǎn)換寫成const(char*)*p,因?yàn)樵?/p>
6、定義是"()"是表示函數(shù)。三、深入理解7種組合???(0)程序?在執(zhí)行時(shí)為其開辟的空間皆在內(nèi)存(RAM)中,而RAM里的內(nèi)存單元是可讀可寫?的;指針只是用來指定或定位要操作的數(shù)據(jù)的工具,只是用來讀寫RAM里內(nèi)存單元的工作指針?。若對(duì)指針不加任何限定,程序中一個(gè)指針可以指向RAM中的任意位置(除了系統(tǒng)敏感區(qū),如操作系統(tǒng)內(nèi)核所在區(qū)域)并對(duì)其指向的內(nèi)存單元進(jìn)行讀和寫操作(由RAM的可讀可寫屬性決定);RAM里內(nèi)存單元的可讀可寫屬性不會(huì)因?yàn)閷?duì)工作指針的限定而變化(見下面的第4點(diǎn)),而所有對(duì)指針的各種const限定說白了只是對(duì)該指針?的?讀寫權(quán)限?(包括讀寫位置)進(jìn)行了限定?。???(1)char*p
7、:p是一個(gè)工作指針,可以用來對(duì)任意位置?(非系統(tǒng)敏感區(qū)域)進(jìn)行讀操作和寫操作?,一次讀寫一個(gè)字節(jié)(char占一個(gè)字節(jié))。????(2)constchar*p或者charconst*p(因?yàn)闆]有const*p運(yùn)算,因此const修飾的還是前面的char):可以對(duì)任意位置(非系統(tǒng)敏感區(qū)域)進(jìn)行“只讀”?操作。(“只讀”是相對(duì)于char*p來說所限定的內(nèi)容)???(3)char*constp(const修飾的是p)