C語言中指標和多維陣列

2021-10-20 04:23:18 字數 1974 閱讀 1417

陣列是乙個特殊的指標,多維陣列也是更為複雜的陣列,它們的關係是什麼樣的呢?

我們通過乙個簡單的例子來比較形象的了解指標和多維陣列:

int a[2][3];

這是乙個2*3的二維陣列,首先我們清楚陣列名就是指向陣列首元素的常量指標(它不可以指向其他部分,可以對指向的元素進行任意修改);其次c語言中所謂的多維陣列,即是陣列的陣列,2*3的二維陣列,本質上為2個有包含3個int的資料的陣列。所以現在我們就可以解釋a的含義:

a == &a[0]

那麼對於a[0]也有

a[0] == &a[0][0]

這時候我們就也可以得到另乙個特殊的結論:a == a[0],字面上看起來很難理解,這是因為對於乙個指標它指向乙個元素有兩個要素:第一為這個元素的首位址,第二為這個元素的型別(這也是我們在使用指標所必要要求的必須指向與它型別相同的元素),所以a是乙個指向包含3個int元素的陣列指標,a[0]是指向int元素的指標。在比較兩者時即比較首位址,無疑都是這個二維陣列的首位址。

#include

int main (

void

)

但是兩者仍然有差別,這種差別是在型別上的,也可謂是根本上的,通過指標的增加運算我們可以看到他們的不同:

#include

int main (

void

)return0;

}/**

yes!

no!a = 0061ff00

p = 0061ff0c

pp = 0061ff04

因為a為int (*)[3]型別,所以a+1移動了3*4=12個儲存單元,末位為c;a[0]為int *型別,所以a[0]+1移動了4個單元,這時候它們不再相等。

**/

因為c語言要求指標在指向乙個元素時型別必須同元素一致,所以我們想使用指標指向陣列時不能簡單使用指向int型別的指標。例如對於二維陣列a[2][3]

int main (

void

)

我們使用int (*p)[3]而不是int *p[3],因為前者表示指向含有三個整數陣列的指標,後者為含有3個整型指標的陣列。

我們也能通過解引用這樣的指標對於陣列內容進行訪問。

我們通過討論陣列名這個特殊的指標來了解指向多維陣列的指標,a == &a[0],所以*a = a[0]為第乙個指向長度為3陣列的指標;a[0] == &a[0][0],所以*a[0] = a[0][0]這樣我們就訪問了二維陣列的第乙個元素,所以**a == a[0][0],我們可以通過多次解引用對多維陣列元素進行訪問,對於二維陣列a[1][2]等價於*(*(a+1)+2)

但是通過這樣對乙個陣列進行訪問往往會造成費解,而且有時候會出現不安全的現象:

#include

int main (

void

)/**

b = 30

b = 10

**/

我們驚奇發現b竟然也被修改了!因為我們讓pp2指向指標p1。然後因為pp2是指向常量的指標,所以*pp2也可以指向常量b,但是其實*pp2是p1!這時候我們就能通過p1修改常量b的值,這樣行為是很危險的!所以不要使用巢狀指標。

c語言中指標和多維陣列的理解

1.複習指標和陣列之間的特殊關係 不帶方括號的陣列名是乙個指標,指向該陣列的第乙個元素。2.多維陣列 int multi 2 4 宣告乙個二維陣列作為舉例 a.理解方式1 可以將陣列看成行和列構成,即理解成2行4列。傳統的理解方法 理解方式2 可以將multi陣列看作乙個包含2個元素,而其中每個元素...

C語言中指標陣列與陣列指標

1 指標陣列的實質是乙個陣列,這個陣列中儲存的內容全部是指標變數。2 陣列指標的實質是乙個指標,這個指標指向的是乙個陣列。1 int p 5 int p 5 int p 5 2 一般規律 int p p是乙個指標 int p 5 p是乙個陣列 3 如果核心和 結合,表示核心是指標 如果核心和 結合,...

C語言中指標和陣列

首先,明確乙個概念,指標是什麼,一旦提到這個老生常談且富有爭議性的話題,那真是1000個人有1000種看法。在國內的很多教材中,給出的定義一般就是 指標就是位址 從初步理解指標的角度來說,這種說法是最容易理解的,但是這種說法明顯有它的缺陷所在。指標就是位址 這種說法相當於 指標 字面值位址 或者說乙...