<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > C++中const與指針、引用的分析

          C++中const與指針、引用的分析

          作者: 時間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
          C++中函數(shù)的參數(shù)相比C語言中的函數(shù)參數(shù)要復(fù)雜的多,其中主要的原因是C++中引入了引用以及const限定符。這兩個對象的引入,使得C++中的函數(shù)參數(shù)變得異常的復(fù)雜多變,每一種類型都具有比較適合的使用范圍。

          本文詳細的分析const與指針、引用在一起存在情況下的情況分析。

          首先介紹引用
          引用是對象的別名,必須在初始化的過程中與一個具體的對象綁定起來,綁定完成以后就再也不能夠修改了,引用貌似和指針有很大的相似性,但是引用是引用,是一個別名,而指針是一個變量,只是變量中保存的是對象的地址,引用并不分配新的內(nèi)存空間。因此一個引用與一塊內(nèi)存區(qū)域綁定,是這塊內(nèi)存區(qū)域的別名,就如同數(shù)組名一樣,數(shù)組是內(nèi)存中的一塊區(qū)域,數(shù)組名是這塊區(qū)域的名字,但是在內(nèi)存中并不存在額外的區(qū)域保存數(shù)組名。引用就是一塊內(nèi)存區(qū)域的別名。C++中變量實質(zhì)上就是一塊內(nèi)存區(qū)域,我們在用&i就可以得到變量i的地址,也就是說變量是這塊區(qū)域的名字。對變量的操作實質(zhì)上就是對這塊內(nèi)存中內(nèi)容的操作。別名是這塊區(qū)域的另一個名字。采用任何一個名字對這塊區(qū)域修改都會影響區(qū)域的內(nèi)容。

          本文引用地址:http://www.ex-cimer.com/article/201612/324522.htm

          int vari = 10;
          int &refr = vari;
          vari = 20;
          cout << refr << " " << vari << endl;
          refr = 30;
          cout << refr << " " << vari << endl;

          上面的int &refr = vari實質(zhì)上就是變量vari的別名,也就是保存vari變量地址的別名,這個地址中保存的是一個int類型的數(shù)據(jù),數(shù)據(jù)可以通過vari來操作,可以修改。因為refr是一個別名,也可以通過該別名對這塊內(nèi)存區(qū)域進行操作。也就是說別名的操作就是針對一塊特定的內(nèi)存區(qū)域,這個通過變量操作的效果是一致的。
          其次說說const限定符
          const的引入使得在函數(shù)操作中的一些問題復(fù)雜了,但是更加的合理了,const限定符是指上是指一個常量。這個常量在一般的情況下就是限定變量不能修改,但是當這個限定符與引用、指針結(jié)合在一起時,使得很多的問題不在明朗。

          1、const與指針

          int *ptr;
          const int *ciptr;
          int const *icptr;
          int * const cptr;
          const int * const cicptr;

          上面是關(guān)于const與指針結(jié)合時的各種情況,這并不只是C++中經(jīng)常遇到的問題,在C語言中也會有類似的討論,雖然const并不是C語言中的關(guān)鍵字。
          int * ptr 是指定義一個指向int 類型的指針ptr。
          const int *ciptr 是指定義一個指向const int 類型的指針ciptr,這是const 限定的是(* ciptr),也就是對指針解引用,即const限定的就是數(shù)據(jù)本身,而非指針。所以ciptr是一個指向常int型數(shù)據(jù)的指針。
          int const * icptr其實和上面的const int *ciptr是一致的因為const只是一個限定符,在int前還是后都 沒有影響,他限定的仍然是(*icptr),并不是icptr,也就是icptr也是指向常int型數(shù)據(jù)的指針,也就是說在icptr這個指針看來,它指向的數(shù)據(jù)是常數(shù),是不能改變的,但是是否真的不能改變,需要依據(jù)實際的類型的分析,只是不能通過這個指針來改變。也就是說該指針是一個自以為自己指向常量的指針。
          int * const cptr 這時候我們還是結(jié)合const的位置分析,const限定的是cptr,cptr我們可以知道是一個指針,也就是說const限定的是一個指針,而不是指針指向的數(shù)據(jù),也就是說這種定義實質(zhì)上是定義一個常指針,也就是指針指向的地址是不變的,也就是cptr是不能被賦值的,不能采用這個指針指向其他的對象或者地址。但是這個地址中的數(shù)據(jù)并不是常數(shù),是可以改變的,可以通過對*cptr進行修改。這種指針實質(zhì)上也就使得指針的效果大大減小,并不常用。
          const int * const cicptr 這種定義結(jié)合上面的分析我們知道是一個指向常量的常指針,也就說這個指針指向的地址是一個常地址,指針不能指向其他的對象或者地址。同時對指針cicptr來說,我指向的這個地址中的內(nèi)容也是不能修改的,是一個常量,是不能修改的,但是該地址的數(shù)據(jù)能否修改還需要進行實際的分析。

          2、關(guān)于指針的初始化、賦值的問題
          對于const類型的數(shù)據(jù),如果需要定義指針,這時候只能定義const類型的數(shù)據(jù),這是為什么呢?因為對于const對象來說,數(shù)據(jù)是肯定不能修改的,如果定義指向非const的指針,程序員可能就會通過指針來修改對象的值,但是const對象是不能被修改的,肯定會出現(xiàn)錯誤。因此const的變量只能采用指向常量的指針來指向。一般來說如果將一個非const指針指向了一個const對象,編譯的過程中就會拋出如下的錯誤:

          invalid conversion from ‘const int*’ to ‘int*’

          但是對于指向常量的指針并不一定指向的數(shù)據(jù)就是常量,這是一個非常重要的技術(shù)點,指向常量的指針指向的數(shù)據(jù)只是針對這個指針而言,他認為自己指向的數(shù)據(jù)是常量,休想通過他來修改指向的對象。也就是說指向常量的指針在初始化、賦值的時可以初始化或者賦值為非const變量的地址,即可以指向非const的對象,只是不能通過該指針來修改對象罷了。
          同時需要注意:對于指向const的指針,初始化過程比較方便,不要求是const對象的地址,可以采用非const對象的地址初始化,甚至還可以采用指向非const的指針直接賦值初始化,這時指針自己認為自己指向的對象是常量。但是不能將指向const的指針直接賦值給指向非const的指針,如果不小心賦值也會出現(xiàn)上面出現(xiàn)的問題。下面參看一段小的代碼,說明其中的一些問題。

          #include
          #include
          #include

          using namespace std;

          int main()
          {
          int num = 20;
          const int array_size = 10;


          int *pnum = #
          const int * cpnum = #
          /*const int *指針可以采用int *指針直接初始化*/
          const int *csize1 = pnum;


          /*但是int * 指針不能采用const int *制作初始化*/
          //int *psize = &array_size;
          /*const類型數(shù)據(jù)只能采用指向const的指針來指向*/
          const int *csize = &array_size;

          cout << "Before change..." << endl;
          cout << "The num of num = " << num << endl;
          cout << "*pnum = " << *pnum << " "
          << "*cpnum = " << *cpnum << " "
          << "csize1 = " << *csize1 << endl;

          num = 30;

          cout << "After changed..." << endl;
          cout << "The num of num = " << num << endl;
          cout << "*pnum = " << *pnum << " "
          << "*cpnum = " << *cpnum << " "
          << "csize1 = " << *csize1 << endl;

          return 0;
          }


          從上面的結(jié)果我們可以知道指向const的指針可以采用非const變量的地址進行初始化或者賦值操作,同時也可以采用指向非const指針直接初始化指向const的指針。同時指向const的指針不能賦值給指向非const的指針,會出現(xiàn)const int *不能轉(zhuǎn)換到int *的問題。

          3、const與引用
          關(guān)于const和引用在一起情況下也存在一些類似于指針的情況,但是畢竟引用相比指針要簡單,這時候情況也比較簡單.但是我認為分析引用應(yīng)該與分析指針是一樣也存在類似的問題。但是引用就只有兩種,非const的引用和const的引用。


          上一頁 1 2 下一頁

          關(guān)鍵詞: C++const指針引

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();