陣列是乙個特殊的指標,多維陣列也是更為複雜的陣列,它們的關係是什麼樣的呢?我們通過乙個簡單的例子來比較形象的了解指標和多維陣列:
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)
但是通過這樣對乙個陣列進行訪問往往會造成費解,而且有時候會出現不安全的現象:
我們驚奇發現b竟然也被修改了!因為我們讓pp2指向指標p1。然後因為pp2是指向常量的指標,所以*pp2也可以指向常量b,但是其實*pp2是p1!這時候我們就能通過p1修改常量b的值,這樣行為是很危險的!所以不要使用巢狀指標。#include
int main (
void
)/**
b = 30
b = 10
**/
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種看法。在國內的很多教材中,給出的定義一般就是 指標就是位址 從初步理解指標的角度來說,這種說法是最容易理解的,但是這種說法明顯有它的缺陷所在。指標就是位址 這種說法相當於 指標 字面值位址 或者說乙...