陣列指標與二維陣列詳解

2021-09-06 20:00:27 字數 1976 閱讀 8761

前言:

1)如何識別二維陣列。 假設陣列為a[2][5]

二維陣列肯定是有兩個維度,從左到右看:

[2]是第乙個維度,表示a這個陣列裡有兩個元素。

[5]是第二個維度,需要進入內部觀察。第乙個維度的每個元素的內部有5個int型的元素。

2)「陣列名代表陣列首元素的位址」這句話既適用於一維陣列,也適用於二維陣列。

1、對於一維陣列int a[5]而言:陣列名a就表示首元素a[0]的位址,及陣列名a等價於&a[0];

3、對於二維數b[2][5]組而言:b[0]是第一維陣列的首元素,同時b[0]也是第二維中的陣列的陣列名。

所以陣列名b[0]就表示首元素b[0][0]的位址,及陣列名b[0]等價於&b[0][0];

4、對於二維數b[2][5]組而言:b[1]雖然不是第一維陣列的首元素,但也是第二維中的陣列的陣列名。

所以陣列名b[1]就表示首元素b[1][0]的位址,及陣列名b[1]等價於&b[1][0];

3)訪問二維陣列的兩種方式

1、普通指標指向二維陣列的第一維

由於二維陣列的,第一維度都是普通的一維陣列。如b[2][5]中b[0]和b[1]就都是一維的int型陣列。

而b[0]和b[1]都是陣列名,分別代表b[0][0]和b[1][0]的位址,所以指標指向二維陣列的第一維很容易:

int* p1 = b[0];

int* p2 = b[1];

那麼此時,用法和一維陣列一樣:

printf("b[0][0] = %d.\n", *p1);//*p1對應的是b[0][0]的值

printf("b[0][1] = %d.\n", *(p1+1));//*(p1+1)對應的是b[0][1]的值

printf("b[1][0] = %d.\n", *p2);//*p2對應的是b[1][0]的值   

printf("b[1][1] = %d.\n", *(p2+1));//*(p2+1)對應的是b[1][1]的值

2、陣列指標訪問二維陣列

對於二維數b[2][5]組而言:陣列名b就表示首元素b[0]的位址,及陣列名b等價於&b[0];

而b[0]不僅僅是二維數b[2][5]的首元素,同時也是乙個陣列的陣列名。

所以,&b[0]就相當於對陣列名再次區位址。那麼我們想想&b[0]是個什麼型別?

假設有乙個一維陣列int a[5],陣列a表示a[0]位址,那麼繼續對陣列名取位址——&a,&a表示什麼呢?

我們都知道&a此時陣列上和a相同,但意義上不同,&a表示整個陣列的位址(而不再是首元素的位址)。

這時陣列指標就可以登場了,陣列指標就是用來指向整個陣列的位址。陣列指標的型別為 int (*)。

所以&b[0]以及&a都是和這種型別相匹配的,或者說他們就是這種型別。

回到一開始說的,二維數b[2][5]的陣列名b等價於&b[0],而&b[0]是對陣列名再次取位址,及&b[0]和int (*)型別匹配。

所以有:

int (*p)[5] = b;//這裡要注意的是數字5,因為二維陣列b[2][5],第二維是5,所以這裡陣列指標也是5;數字不同則不匹配。

我們知道,取值和解引用這兩個過程是反向過程,&b[0]是對位址(陣列名)再次取位址,那麼可以想象,要用陣列指標p訪問到資料,

必須經過兩次解引用。

由於陣列名b就表示首元素b[0]的位址,而陣列名b和陣列指標p是同一種型別,所以第一層解引用就是對b[0]的位址解引用,

及是對第一維陣列的位址解引用。如&b[0]解引用之後就得到b[0],那麼*p就對應b[0],而b[0]仍然是個陣列名,再次進行解引用得到b[0][0],

那麼*(*p)就對應b[0][0]。最後得出結論:b[i][j]等同於 *(*(p+i)+j)

小結:

1、 a[i][j]等同於 *(*(p+i)+j)

2、 p不解引用,對p加減是在第一維里偏移位址

3、 p解一次引用,對*p加減是在第二維里偏移位址

4、 p解二次引用,才能訪問到值,如* (*p)

指標與二維陣列詳解

二維陣列在概念上是二維的,有行和列,但在記憶體中所有的陣列元素都是連續排列的,它們之間沒有 縫隙 以下面的二維陣列 a 為例 int a 3 4 從概念上理解,a 的分布像乙個矩陣 0 1 2 3 4 5 6 7 8 9 10 11 但在記憶體中,a 的分布是一維線性的,整個陣列占用一塊連續的記憶體...

二維陣列 指標詳解

目錄 二維陣列 指標詳解 1.研究二維陣列的表示。2.現在研究關於二維陣列和指標的關係 首先,用 執行進行測試,驗證的相關結果,c.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std int main cout cout a ...

二維陣列 指標陣列與陣列指標

一 首先我們從字面意思理解一下什麼是指標陣列什麼是陣列指標 1 指標陣列 本質是乙個陣列,陣列中的每乙個元素是乙個指標。2 陣列指標 本質是乙個指標,而指標指向乙個陣列。二 我們該怎麼區分指標陣列和陣列指標?1 總共有三種表示形式 int p 4 和int p 4 和int p 4 表面看起來是不是...