二維陣列的指標及陣列的符號理解

2021-06-28 04:57:41 字數 1622 閱讀 3408

最近在學習關於二維陣列及陣列指標的問題,看了好幾篇大神們寫的部落格,茅塞一頓一頓的開了。理解了陣列符號的含義以及陣列指標,指標陣列,等等概念。為了紀念一下,遂把我學到的知識記錄下來。

首先是關於陣列符號問題。

這裡貼上上這篇部落格的一些講解,我覺得非常清晰。

設p是指向陣列a的指標變數,若有:

p=a[0];

則p+j將指向a[0]陣列中的元素a[0][j]。

由於a[0]、a[1]┅a[m-1]等各個行陣列依次連續儲存,則對於a陣列中的任一元素a[i][j],指標的一般形式如下:

p+i*n+j

元素a[i][j]相應的指標表示為:

*( p+i*n+j)

同樣,a[i][j]也可使用指標下標法表示,如下:

p[i*n+j]

例如,有如下定義:

int a[3][4]=,,};

則陣列a有3個元素,分別為a[0]、a[1]、a[2]。而每個元素都是乙個一維陣列,各包含4個元素,如a[1]的4個元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。

若有:int *p=a[0];

則陣列a的元素a[1][2]對應的指標為:p+1*4+2

元素a[1][2]也就可以表示為:*( p+1*4+2)

用下標表示法,a[1][2]表示為:p[1*4+2]

特別說明:

對上述二維陣列

a,雖然a[0]、a都是陣列首位址,但二者指向的物件不同,

a[0]是一維陣列的名字,它指向的是a[0]陣列的首元素,對其進行「*」運算,得到的是乙個陣列元素值,即a[0]陣列首元素值,因此,*a[0]與a[0][0]是同乙個值;而a是乙個

二維陣列

的名字,它指向的是它所屬元素的首元素,它的每乙個元素都是乙個行陣列,因此,它的指標移動單位是「行」,所以a+i指向的是第i個行陣列,即指向a[i]。對a進行「*」運算,得到的是一維陣列a[0]的首位址,即*a與a[0]是同乙個值 對於

二維陣列

a,其a[0]陣列由a指向,a[1]陣列則由a+1指向,a[2]陣列由a+2指向,以此類推。因此,*a與a[0]等價、*(a+1)與a[1]等價、*(a+2)與a[2]等價,┅,即對於a[i]陣列,由*(a+i)指向。由此,對於陣列元素a[i][j],用陣列名a的表示形式為:

*(*(a+i)+j)

指向該元素的指標為:

*(a+i)+j

上面的文字對陣列的符號,特別是二維陣列的符號做了非常清晰的解釋。也就是說,當我們宣告乙個int型陣列時,比如 int a[10]=此時,a是乙個指標,它指向這個陣列的首元素。再就是,二維陣列其實只是乙個比較奇葩的一維陣列。奇葩之處在於,它的每乙個元素都是乙個一維陣列。也就是說,當我們宣告乙個int b [3][4]時,它其實只有3個元素,分別是

b[0]

[4],

b[1]

[4],

b[2]

[4],這裡塗了顏色的地方,跟剛才的a是同樣型別的東西,它們都是一維陣列的指標。而b跟a不是同樣型別的東西。b雖然也是指標,但b指的東西只能是

b[0]

,b[1]

,b[2]

.另外還有一點,就是*這個符號。在宣告東西的時候,它表示這是乙個指標。在其他地方,它表示「這個位址裡面所存的元素」,可以看成是一種運算了,跟&正好相反。

二維陣列及指標

乙個陣列的元素值為指標則是指標陣列。指標陣列的所有元素都必須是具有相同儲存型別和指向相同資料型別的指標變數。指標陣列說明的一般形式為 型別說明符 陣列名 陣列長度 其中型別說明符為指標值所指向的變數的型別。例如 int pa 3 表示pa 是乙個指標陣列,它有三個陣列元素,每個元素值都是乙個指標,指...

關於二維指標陣列的理解

一 二維陣列int a 3 3 a可以分解為3個一維指標,a a 0 a 1 a 陣列名代表 著陣列首元素的位址,假設 a 0 0 1000,則a 1000,a代表a的位址1000所指的記憶體a 0 同時a 0 也是乙個陣列,因此a 0 也是位址,a a a 0 a 0 0 a 0 1000.c語言...

C 理解二維陣列的指標

用乙個main函式來描述這個問題吧 今天終於弄明白 p,p 4 p 4 的區別 int main 理解二維陣列的指標 首先,二維陣列的名稱 arr 是乙個指標,它相當於這樣的乙個指標 p 4 它是乙個 指標的指標 從第一層面來講,它是乙個包含4個元素陣列的指標,int p 4 arr p等於這個陣列...