<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

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

本文引用地址:http://dyxdggzs.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實(shí)質(zhì)上就是變量vari的別名,也就是保存vari變量地址的別名,這個(gè)地址中保存的是一個(gè)int類(lèi)型的數據,數據可以通過(guò)vari來(lái)操作,可以修改。因為refr是一個(gè)別名,也可以通過(guò)該別名對這塊內存區域進(jìn)行操作。也就是說(shuō)別名的操作就是針對一塊特定的內存區域,這個(gè)通過(guò)變量操作的效果是一致的。
其次說(shuō)說(shuō)const限定符
const的引入使得在函數操作中的一些問(wèn)題復雜了,但是更加的合理了,const限定符是指上是指一個(gè)常量。這個(gè)常量在一般的情況下就是限定變量不能修改,但是當這個(gè)限定符與引用、指針結合在一起時(shí),使得很多的問(wèn)題不在明朗。

1、const與指針

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

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

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

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

但是對于指向常量的指針并不一定指向的數據就是常量,這是一個(gè)非常重要的技術(shù)點(diǎn),指向常量的指針指向的數據只是針對這個(gè)指針而言,他認為自己指向的數據是常量,休想通過(guò)他來(lái)修改指向的對象。也就是說(shuō)指向常量的指針在初始化、賦值的時(shí)可以初始化或者賦值為非const變量的地址,即可以指向非const的對象,只是不能通過(guò)該指針來(lái)修改對象罷了。
同時(shí)需要注意:對于指向const的指針,初始化過(guò)程比較方便,不要求是const對象的地址,可以采用非const對象的地址初始化,甚至還可以采用指向非const的指針直接賦值初始化,這時(shí)指針自己認為自己指向的對象是常量。但是不能將指向const的指針直接賦值給指向非const的指針,如果不小心賦值也會(huì )出現上面出現的問(wèn)題。下面參看一段小的代碼,說(shuō)明其中的一些問(wè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類(lèi)型數據只能采用指向const的指針來(lái)指向*/
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;
}


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

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


上一頁(yè) 1 2 下一頁(yè)

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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>