C語言中的二維數(shù)組和指針

二維數(shù)組

二維數(shù)組在概念上是二維的钠怯,有行和列佳魔,但在內(nèi)存中所有的數(shù)組元素都是連續(xù)排列的,它們之間沒有“縫隙”晦炊。以下面的二維數(shù)組 a 為例:

int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };

從概念上理解鞠鲜,a 的分布像一個(gè)矩陣:

0? 1? 2? 3

4? 5? 6? 7

8? 9? 10? 11

但在內(nèi)存中,a 的分布是一維線性的断国,整個(gè)數(shù)組占用一塊連續(xù)的內(nèi)存:

可以把二維數(shù)組轉(zhuǎn)換為:

int x=? {0, 1, 2, 3};? ? int y ={4, 5, 6, 7};? int z ={8, 9, 10, 11} ;

int[4]? a = { x, y , z };//數(shù)據(jù)類型為int[4]

int (*p)[4]? = a;//p 指向的數(shù)據(jù)類型是int [4]

C語言中的二維數(shù)組是按行排列的贤姆,也就是先存放 a[0] 行,再存放 a[1] 行稳衬,最后存放 a[2] 行霞捡;每行中的 4 個(gè)元素也是依次存放。數(shù)組 a 為 int 類型薄疚,每個(gè)元素占用 4 個(gè)字節(jié)碧信,整個(gè)數(shù)組共占用 4×(3×4) = 48 個(gè)字節(jié)街夭。

C語言允許把一個(gè)二維數(shù)組分解成多個(gè)一維數(shù)組來處理砰碴。對(duì)于數(shù)組 a,它可以分解成三個(gè)一維數(shù)組板丽,即 a[0]呈枉、a[1]、a[2]檐什。每一個(gè)一維數(shù)組又包含了 4 個(gè)元素碴卧,例如 a[0] 包含 a[0][0]、a[0][1]乃正、a[0][2]住册、a[0][3]。

假設(shè)數(shù)組 a 中第 0 個(gè)元素的地址為 1000瓮具,那么每個(gè)一維數(shù)組的首地址如下圖所示:

指針

為了更好的理解指針和二維數(shù)組的關(guān)系荧飞,我們先來定義一個(gè)指向 a 的指針變量 p:

int (*p)[4] = a;

括號(hào)中的*表明 p 是一個(gè)指針,它指向一個(gè)數(shù)組名党,數(shù)組的類型為int [4]叹阔,這正是 a 所包含的每個(gè)一維數(shù)組的類型。

[ ]的優(yōu)先級(jí)高于*传睹,( )是必須要加的耳幢,如果赤裸裸地寫作int *p[4],那么應(yīng)該理解為int *(p[4]),p 就成了一個(gè)指針數(shù)組睛藻,而不是二維數(shù)組指針启上。

對(duì)指針進(jìn)行加法(減法)運(yùn)算時(shí),它前進(jìn)(后退)的步長(zhǎng)與它指向的數(shù)據(jù)類型有關(guān)店印,p 指向的數(shù)據(jù)類型是int [4]冈在,那么p+1就前進(jìn) 4×4 = 16 個(gè)字節(jié),p-1就后退 16 個(gè)字節(jié)按摘,這正好是數(shù)組 a 所包含的每個(gè)一維數(shù)組的長(zhǎng)度包券。也就是說,p+1會(huì)使得指針指向二維數(shù)組的下一行炫贤,p-1會(huì)使得指針指向數(shù)組的上一行溅固。

數(shù)組名 a 在表達(dá)式中也會(huì)被轉(zhuǎn)換為和 p 等價(jià)的指針!

下面我們就來探索一下如何使用指針 p 來訪問二維數(shù)組中的每個(gè)元素兰珍。按照上面的定義:

1)p指向數(shù)組 a 的開頭发魄,也即第 0 行;p+1前進(jìn)一行俩垃,指向第 1 行。

2)*(p+1)表示取地址上的數(shù)據(jù)汰寓,也就是整個(gè)第 1 行數(shù)據(jù)口柳。注意是一行數(shù)據(jù),是多個(gè)數(shù)據(jù)有滑,不是第 1 行中的第 0 個(gè)元素跃闹,下面的運(yùn)行結(jié)果有力地證明了這一點(diǎn):

#include? ? <stdio.h>

int main(){

int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };

int (*p)[4] = a;

printf("%d\n", sizeof(*(p+1)));

return 0;

}

運(yùn)行結(jié)果:

16

3)*(p+1)+1表示第 1 行第 1 個(gè)元素的地址。如何理解呢毛好?

*(p+1)單獨(dú)使用時(shí)表示的是第 1 行數(shù)據(jù)望艺,放在表達(dá)式中會(huì)被轉(zhuǎn)換為第 1 行數(shù)據(jù)的首地址,也就是第 1 行第 0 個(gè)元素的地址肌访,因?yàn)槭褂谜袛?shù)據(jù)沒有實(shí)際的含義找默,編譯器遇到這種情況都會(huì)轉(zhuǎn)換為指向該行第 0 個(gè)元素的指針;就像一維數(shù)組的名字吼驶,在定義時(shí)或者和 sizeof惩激、& 一起使用時(shí)才表示整個(gè)數(shù)組,出現(xiàn)在表達(dá)式中就會(huì)被轉(zhuǎn)換為指向數(shù)組第 0 個(gè)元素的指針蟹演。

4)*(*(p+1)+1)表示第 1 行第 1 個(gè)元素的值风钻。很明顯,增加一個(gè) * 表示取地址上的數(shù)據(jù)酒请。

根據(jù)上面的結(jié)論骡技,可以很容易推出以下的等價(jià)關(guān)系:

a+i == p+i

a[i] == p[i] == *(a+i) == *(p+i)

a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == *(*(a+i)+j) == *(*(p+i)+j)

【實(shí)例】使用指針遍歷二維數(shù)組。

運(yùn)行結(jié)果:

0? 1? 2? 3

4? 5? 6? 7

8? 9? 10? 11

指針數(shù)組和二維數(shù)組指針的區(qū)別

指針數(shù)組和二維數(shù)組指針在定義時(shí)非常相似羞反,只是括號(hào)的位置不同:

int *(p1[5]);? //指針數(shù)組布朦,可以去掉括號(hào)直接寫作 int *p1[5];

指針數(shù)組和二維數(shù)組指針有著本質(zhì)上的區(qū)別:指針數(shù)組是一個(gè)數(shù)組囤萤,只是每個(gè)元素保存的都是指針,以上面的 p1 為例喝滞,在32位環(huán)境下它占用 4×5 = 20 個(gè)字節(jié)的內(nèi)存阁将。二維數(shù)組指針是一個(gè)指針,它指向一個(gè)二維數(shù)組右遭,以上面的 p2 為例做盅,它占用 4 個(gè)字節(jié)的內(nèi)存。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窘哈,一起剝皮案震驚了整個(gè)濱河市吹榴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滚婉,老刑警劉巖图筹,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異让腹,居然都是意外死亡远剩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門骇窍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓜晤,“玉大人,你說我怎么就攤上這事腹纳×÷樱” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵嘲恍,是天一觀的道長(zhǎng)足画。 經(jīng)常有香客問我,道長(zhǎng)佃牛,這世上最難降的妖魔是什么淹辞? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮俘侠,結(jié)果婚禮上桑涎,老公的妹妹穿的比我還像新娘。我一直安慰自己兼贡,他們只是感情好攻冷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遍希,像睡著了一般等曼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天禁谦,我揣著相機(jī)與錄音胁黑,去河邊找鬼。 笑死州泊,一個(gè)胖子當(dāng)著我的面吹牛丧蘸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播遥皂,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼力喷,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了演训?” 一聲冷哼從身側(cè)響起弟孟,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎样悟,沒想到半個(gè)月后拂募,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窟她,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年陈症,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片震糖。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爬凑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出试伙,到底是詐尸還是另有隱情,我是刑警寧澤于样,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布疏叨,位于F島的核電站,受9級(jí)特大地震影響穿剖,放射性物質(zhì)發(fā)生泄漏蚤蔓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一糊余、第九天 我趴在偏房一處隱蔽的房頂上張望秀又。 院中可真熱鬧,春花似錦贬芥、人聲如沸吐辙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昏苏。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贤惯,已是汗流浹背洼专。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孵构,地道東北人屁商。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像颈墅,于是被迫代替她去往敵國(guó)和親蜡镶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容