前面已經(jīng)寫過(guò)很多關(guān)于C/C++一級(jí)指針的內(nèi)容,一級(jí)指針對(duì)初學(xué)者來(lái)說(shuō)就已經(jīng)比較難以理解了,二級(jí)指針就更加難了,本文借助數(shù)組來(lái)理解二級(jí)指針;那么,下面就讓我們一起來(lái)學(xué)習(xí)一下二級(jí)指針和二維數(shù)組; 兩個(gè)與指針息息相關(guān)的運(yùn)算符 說(shuō)起指針,那么有兩運(yùn)算符兄弟不得不提,取址運(yùn)算符“&”和間接運(yùn)算符 “*”(indirection operator),有時(shí)候這會(huì)被稱為解引用運(yùn)算符; 取址運(yùn)算符“&”:用來(lái)取得其操作數(shù)的地址; 間接運(yùn)算符 “*”:它的操作數(shù)必須是指針類型,用來(lái)取得指針?biāo)赶虻膶?duì)象; 例如: int a = 100 ; &a ; 此處&a其實(shí)就是一個(gè)指針了, 它的類型是int類型指針類型(int*類型): int a = 100 ; 在C/C++中賦值運(yùn)算符“=”左右兩邊類型必須相同或者存在繼承關(guān)系,p2 = &a ;說(shuō)明,p2就等于對(duì)象a的地址,我們通過(guò)間接運(yùn)算符 “*”或者稱解引用運(yùn)算符更易理解,就能取得p2所存地址上存放的對(duì)象。 此時(shí)若運(yùn)行上述代碼,cout<<* p;輸出的將是200 ;這是因?yàn)閜和p2都存的a的地址,但是*p2 = b將該地址上的對(duì)象的值修改為200了,所以當(dāng)你再用*p去取值得時(shí)候與*p2訪問(wèn)的是同一塊地址; 指針內(nèi)存示意圖 二級(jí)指針 有了一級(jí)指針的基礎(chǔ),指針變量在計(jì)算機(jī)內(nèi)存中其實(shí)存放的是指向的對(duì)象的地址,指針的功能其實(shí)都是通過(guò)取址運(yùn)算符“&”,和間接運(yùn)算符 “*”來(lái)實(shí)現(xiàn)的,指針本身是沒(méi)什么神奇的。所以大家可以對(duì)其少一些敬畏之心。 int a = 100 ; &a ; int* p = &a; int* p2 = nullptr ; p2 = &a ; int b = 200 ; *p2 = b ; int** p3 = &p2 ; cout<<** p3; 二級(jí)指針示意圖 二級(jí)指針變量存的其實(shí)就是一級(jí)指針變量在內(nèi)存中的地址。再由解引用運(yùn)算符“*”逐級(jí)剝離,最終取的實(shí)體對(duì)象。 二維數(shù)組與指針 指針與一級(jí)指針的關(guān)系很簡(jiǎn)單:一維數(shù)組,在內(nèi)存上是連續(xù)的,所以找到一個(gè)數(shù)組的所有元素只需要知道該數(shù)組的元素類型和首元素的地址就可以逐一找到所有元素。而數(shù)組名就代表首地址; 一維數(shù)組示意圖 int arr[] = {0,1,2,3,4,5} ; 如上述代碼: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ù)組,所以用二級(jí)指針表示就是: 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ù)組,可以由一級(jí)指針表示,再由指針偏移逐一訪問(wèn)各元素: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} ; 指針數(shù)組 所以二級(jí)指針可以看成是由指針組成的一維數(shù)組 來(lái)源:今日頭條@編程老大叔 |
|