溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

二維數(shù)組和它的指針

發(fā)布時(shí)間:2020-07-14 14:43:49 來(lái)源:網(wǎng)絡(luò) 閱讀:435 作者:寒風(fēng)飄葉22 欄目:編程語(yǔ)言

這片文章介紹二維數(shù)組int a[ i ] [ j ]中的符號(hào):a,&a[ i ],&a[ i ][ j ],a[ i ][ j ],&a[ i ] [ j ]的含義,重點(diǎn)在后面第二部分的分析,但是前面第一部分的復(fù)習(xí)數(shù)組指針,指針數(shù)組和二維指針是前提,前面的不會(huì),后面的沒(méi)法理解。這片文章寫的有些費(fèi)勁,個(gè)人能力不夠,可能會(huì)有錯(cuò)誤,希望各位朋友能夠指正,共同進(jìn)步。//握手

一:先回顧一下數(shù)組指針,指針數(shù)組,二維指針

先根據(jù)逐層分析分方法分析下面的代碼 
(1)int (*p)[5]; 
(2)int *p[5]; 
(3)int **p;

看到上面的定義方式一一分析 
分析(1) 
第一步:找核心,核心是p 
第二步:由p向外一層分析,p和*結(jié)合是指針,再和[]結(jié)合,所以int (*p)[5] 是數(shù)組指針

分析(2) 
第一步:找核心,核心是p 
第二步:由核心p向外一層分析,p先和[]結(jié)合是數(shù)組,數(shù)組中元素是*類型,所以int *p[5];是指針數(shù)組。

分析(3) 
第一步:找核心,核心是p 
第二步:由p向外一層分析,p先和結(jié)合是指針,然后*p再和結(jié)合是指針的指針,即二重指針。

(4)二重指針和指針數(shù)組 
二重指針就是指針數(shù)組指針(有點(diǎn)亂哈)

先看指針數(shù)組 int *p[5]; 
(1)p是一個(gè)數(shù)組,數(shù)組有5個(gè)元素,每個(gè)元素都是int*類型 
(2)指向int * 類型的指針不就是int**嘛 
(3)得出結(jié)論,二重指針就是指針數(shù)組指針。

二:二維數(shù)組和指針的糾纏

先定義一個(gè)二維數(shù)組 int a[ i ] [ j ]; 
a是二維數(shù)組數(shù)組名,把二維數(shù)組看成一個(gè)平面。i表示有i行,j表示每行有j列。有一個(gè)一維數(shù)組int a[ 10 ],寫成二維數(shù)組就是int a[ 2 ] [ 5 ],把10個(gè)元素分成2組,每組有5個(gè)元素。i表示第一維表示有多少組,j表示每組有多少元素。

符號(hào)含義 int a[ 2 ][ 5 ];int a[ i ] [ j ];

跟著思路一步一步走

第一維表示有2個(gè)一維數(shù)組分別是 a[ 0 ]和a[ 1 ](也就是a[ i ]和a[i+1]) 
第二維表示在這兩個(gè)數(shù)組中分別有5個(gè)元素。

那么第一個(gè)問(wèn)題來(lái)了

兩個(gè)數(shù)組的數(shù)組名是誰(shuí)?

對(duì),a[ i ]和a[i+1] 既然a[ i ]和a[ i+1 ] 是一維數(shù)組名

那么第二個(gè)問(wèn)題來(lái)了?

a[ i ]和a[ i+1 ]類型是什么?

一維數(shù)組數(shù)組名做右值表示數(shù)組首元素的首地址,首元素是int,首元素的地址是int * ,&b做右值表示整個(gè)數(shù)組的首地址,類型是int(*)[] 
int b[10]; 
int *p; 
p = b;

所以 a[i]這個(gè)數(shù)組名做右值表示數(shù)組首元素的首地址,首元素是一個(gè)數(shù)組,首元素的地址,數(shù)組的首地址是int * ,&a[i]表示整個(gè)數(shù)組的首地址(這個(gè)整個(gè)數(shù)組時(shí)指包含兩個(gè)數(shù)組的那個(gè)數(shù)組)

??!這里很重要: 
迷惑1:a[i]做右值不是表示數(shù)組首元素的首地址嗎?首元素是一個(gè)數(shù)組,那么其類型應(yīng)該是數(shù)組的指針啊,類型是int( * ) [ ];

解答:a[i]這個(gè)數(shù)組名做右值確實(shí)表示數(shù)組首元素的首地址,比如int b[10];數(shù)組名b做右值表數(shù)組首元素的首地址,也就是相當(dāng)于&b[0],那再二維數(shù)組中,a[ i ]和a[i+1]分別是兩個(gè)數(shù)組,每個(gè)數(shù)組有5個(gè)int元素,這么一想就是了:a[ 0 ]這個(gè)數(shù)組名做右值時(shí)等價(jià)于&a[0][0],第1個(gè)數(shù)組的 
第1個(gè)元素,第一個(gè)元素是int類型,所以a[ i ]是int* 類型的指針。&a[ i ]表示整個(gè)數(shù)組(包含i個(gè)數(shù)組的大數(shù)組)的首地址,也就是看的是a[ i ]和a[ i+1 ]這兩個(gè)數(shù)組的首地址,所以&a[ i ]的類型才是數(shù)組指針,int( * ) [ ];二維數(shù)組名a和&a[ i ]類型一致。

二維數(shù)組的運(yùn)算 
int b[ 10 ]; 
下標(biāo)訪問(wèn)b[ 1 ] 
指針訪問(wèn)* ( b+1)

int a[ 2 ] [ 10 ] 
下標(biāo)訪問(wèn)a[ 1 ] [ 1 ] 
指針訪問(wèn)* ( * (a+1)+1)

分析:a是二維數(shù)組的數(shù)組名,在這肯定做右值,a做右值等價(jià)于&a[0]也就是第一個(gè)數(shù)組的首地址,(總共有兩個(gè)數(shù)組),類型是int(*)[];這時(shí)候當(dāng)a+1時(shí),a指向誰(shuí)?a是數(shù)組指針,a肯定指向數(shù)組,這時(shí)候a+1,偏移量為a[i]這個(gè)數(shù)組的大小,指向了a[1]這個(gè)小數(shù)組。每個(gè)小數(shù)組有5個(gè)元素,大小是一個(gè)int。這時(shí)候j的偏移量就是一個(gè)int的大小。

總結(jié): 
(1)int a[ i ][ j ];二維數(shù)組表示有i個(gè)小數(shù)組,沒(méi)個(gè)小數(shù)組有j個(gè)元素。 
(2)a[ 0 ]做右值表示& a[ 0] [ 0 ] 
&a[ 0 ]做右值和二維數(shù)組名a做右值含義一樣。 
(3)a[ i ][ j ]表示每一個(gè)元素,每一個(gè)元素都是int類型的。 
&a[ i ] [ j ]表示int* 類型的指針。 
(4)a[ i ] [ j ] 等價(jià)于 * (* (a+i)+j)

二維數(shù)組比較難理解,難道真的是只可意會(huì)不可言傳?雖然寫了這篇文章,但總感覺(jué)不是很對(duì),以我目前的水平無(wú)法找出錯(cuò)誤,請(qǐng)高手指點(diǎn)。//感謝


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI