小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C :為何不建議用string作為函數(shù)參數(shù)

 InfoRich 2019-12-14

前面已經(jīng)寫過很多關(guān)于C/C++一級指針的內(nèi)容,一級指針對初學(xué)者來說就已經(jīng)比較難以理解了,二級指針就更加難了,本文借助數(shù)組來理解二級指針;那么,下面就讓我們一起來學(xué)習(xí)一下二級指針和二維數(shù)組;

兩個(gè)與指針息息相關(guān)的運(yùn)算符

說起指針,那么有兩運(yùn)算符兄弟不得不提,取址運(yùn)算符“&”和間接運(yùn)算符 “*”(indirection operator),有時(shí)候這會(huì)被稱為解引用運(yùn)算符;

取址運(yùn)算符“&”:用來取得其操作數(shù)的地址;

間接運(yùn)算符 “*”:它的操作數(shù)必須是指針類型,用來取得指針?biāo)赶虻膶ο螅?/p>

例如:

int a = 100 ;
&a ;

此處&a其實(shí)就是一個(gè)指針了, 它的類型是int類型指針類型(int*類型):

int a = 100 ;
&a ;
int* p = &a;
int* p2 = nullptr ;
p2 = &a ;
int b = 200 ;
*p2 = b ;
cout<<* p;

在C/C++中賦值運(yùn)算符“=”左右兩邊類型必須相同或者存在繼承關(guān)系,p2 = &a ;說明,p2就等于對象a的地址,我們通過間接運(yùn)算符 “*”或者稱解引用運(yùn)算符更易理解,就能取得p2所存地址上存放的對象。

此時(shí)若運(yùn)行上述代碼,cout<<* p;輸出的將是200 ;這是因?yàn)閜和p2都存的a的地址,但是*p2 = b將該地址上的對象的值修改為200了,所以當(dāng)你再用*p去取值得時(shí)候與*p2訪問的是同一塊地址;

指針內(nèi)存示意圖

二級指針

有了一級指針的基礎(chǔ),指針變量在計(jì)算機(jī)內(nèi)存中其實(shí)存放的是指向的對象的地址,指針的功能其實(shí)都是通過取址運(yùn)算符“&”,和間接運(yùn)算符 “*”來實(shí)現(xiàn)的,指針本身是沒什么神奇的。所以大家可以對其少一些敬畏之心。

int a = 100 ;
&a ;
int* p = &a;
int* p2 = nullptr ;
p2 = &a ;
int b = 200 ;
*p2 = b ;
int** p3 = &p2 ;
cout<<** p3;

二級指針示意圖

二級指針變量存的其實(shí)就是一級指針變量在內(nèi)存中的地址。再由解引用運(yùn)算符“*”逐級剝離,最終取的實(shí)體對象。

二維數(shù)組與指針

指針與一級指針的關(guān)系很簡單:一維數(shù)組,在內(nèi)存上是連續(xù)的,所以找到一個(gè)數(shù)組的所有元素只需要知道該數(shù)組的元素類型和首元素的地址就可以逐一找到所有元素。而數(shù)組名就代表首地址;

一維數(shù)組示意圖

int arr[] = {0,1,2,3,4,5} ;
int* pArr = nullptr ;
pArr = arr;
pArr = &arr[0] ;
cout<<*(pArr+1) ;//通過指針偏移即能訪問后續(xù)元素
cout<<*(arr+1) ;

如上述代碼:pArr = arr;與pArr = &arr[0] ;是一樣的;cout<<*(pArr+1) ;與cout<<*(arr+1) ;是一樣的,arr在此處亦可看成一個(gè)指針變量;

那么,二維數(shù)組就是在一維數(shù)組的縱向上再增加元素:

二維數(shù)組示意圖

上述二維數(shù)組可以看成是由{01,02,03,04,05},{11,12,13,14,15},{21,22,23,24,25}三個(gè)數(shù)組組成。每個(gè)數(shù)組又可以用指針表示,那么二維數(shù)組就是指針組成的數(shù)組,所以用二級指針表示就是:

int arr[3][5] = {{01,02,03,04,05},
{11,12,13,14,15},
{21,22,23,24,25}} ;
int* pArr1 = arr[0] ; //等價(jià)int* pArr1 = &arr[0][0]
int* pArr2 = arr[1] ; //等價(jià)int* pArr1 = &arr[1][0]
int* pArr3 = arr[2] ; //等價(jià)int* pArr1 = &arr[2][0]
int* arrP[] = {pArr1,pArr2,pArr3};
int** pArr_level2 = arrP ;

每行(橫向?yàn)樾校┦自貫樵撔袛?shù)組的首地址:arr[0],arr[1],arr[2];

由于數(shù)組儲(chǔ)存物理的連續(xù)性,所以可以將二維數(shù)組拉伸看做一維數(shù)組,可以由一級指針表示,再由指針偏移逐一訪問各元素:int arr3[3][5] = {01,02,03,04,05,11,12,13,14,15,21,22,23,24,25} ;

int arr[3][5] = {01,02,03,04,05,11,12,13,14,15,21,22,23,24,25} ;
int* p = nullptr ;
for (p = arr[0]; p < arr[0]+15; p++)
{
cout<<*p<<endl; ;
}

指針數(shù)組

所以二級指針可以看成是由指針組成的一維數(shù)組

來源:今日頭條@編程老大叔

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多