任何能由數(shù)組下標(biāo)完成的操作也可由指針來完成,一個(gè)不帶下標(biāo)的數(shù)組名就是一個(gè)指向此數(shù)組的指針,在 C 語言中數(shù)組名就是數(shù)組的地址。當(dāng)一個(gè)指針變量被初始化為數(shù)組名時(shí),就說該指針變量指向了數(shù)組。
char str[20],*pstr;
pstr=str 等價(jià)于 pstr =&str[0] ; // 指針被置為數(shù)組第一個(gè)元素的地址
訪問數(shù)組第 6 個(gè)元素: str[5],pstr[5], *(str+5),*(pstr+5) 。
值得注意的是 pstr 是一個(gè)可以變化的指針變量,因此 pstr++;++pstr; pstr+=5 都是正確的,而 str 是一個(gè)常數(shù)。因?yàn)閿?shù)組一經(jīng)說明,數(shù)組的地址也就被固定了,故 str++;++str; str+=5 都是錯(cuò)誤的。
編譯系統(tǒng)在處理 str[i] 時(shí),實(shí)際上是將數(shù)組元素的形式 str[i] 轉(zhuǎn)換為 *(str+i) ,然后再進(jìn)行運(yùn)算的。相應(yīng)的引用二維數(shù)組 a[i][j] 則等價(jià)于 (*(a+i))[j] 或 *(*(a+i)+j), 通常式子 *(a+i)+j 是用來計(jì)算元素所在內(nèi)存地址,并不是它的內(nèi)容。
int a[3][4]; // 二維整型數(shù)組
int (*p)[4]; // 整型指針數(shù)組
p=a;
則 p+1 不是指向 a[0][1] ,而是指向 a[1] 。這是 p 的增值以一維數(shù)組長(zhǎng)度為單位。
假設(shè)是這么一個(gè)數(shù)組:
int arr[20];
則 arr 的內(nèi)存示意圖為:
和指針變量相比, 數(shù)組沒有一個(gè)單獨(dú)的內(nèi)存空間而存放其內(nèi)存地址。即:指針變量 p 是一個(gè)獨(dú)立的變量,只不過它的值指向另一段連續(xù)的內(nèi)存空間;而數(shù)組 arr ,本身代表的就是一段連續(xù)空間。
如果拿房間來比喻。指針和數(shù)組都是存放地址。只不過,指針是你口袋里的那本通訊錄上寫著的地址,你可以隨時(shí)改變它的內(nèi)容,甚至擦除。而數(shù)組是你家門楣上釘著的地址,你家原來是“復(fù)興路甲 108 號(hào)”,你絕對(duì)不能趁月黑天高,把它涂改為“唐寧街 10 號(hào)”。
數(shù)組是“實(shí)”的地址,不能改變。當(dāng)你和定義一個(gè)數(shù)組,則這個(gè)數(shù)組就得根據(jù)它在內(nèi)存中的位置,得到一個(gè)地址,如上圖中的“ 0x1A000000 ”。只要這個(gè)數(shù)組存在,那么它終生的地址就是這個(gè)值。
指針是一個(gè)“虛”的地址,可以改變地址的值。當(dāng)你定義一個(gè)指針變量,這個(gè)變量占用 4 個(gè)字節(jié)的內(nèi)存,你可以往這 4 字節(jié)的內(nèi)存寫入任意一個(gè)值,該值被當(dāng)成一個(gè)內(nèi)存地址。比如,你可以寫入上面的“ 0x1A000000 ” , 此時(shí),指針 p 指向第一個(gè)元素。也可以改為“ 0x1A000003 ”,此時(shí),指針 p 指向第二個(gè)元素。
參考:
《 指 針 》
《 A TUTORIAL ON POINTERS AND ARRAYS IN C 》
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
