|
前面已經(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 ; 在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} ;如上述代碼: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} ;指針數(shù)組 所以二級指針可以看成是由指針組成的一維數(shù)組 來源:今日頭條@編程老大叔 |
|
|