1. 程式人生 > >二維數組和它的指針

二維數組和它的指針

二維數組和它的指針

這片文章介紹二維數組int a[ i ] [ j ]中的符號:a,&a[ i ],&a[ i ][ j ],a[ i ][ j ],&a[ i ] [ j ]的含義,重點在後面第二部分的分析,但是前面第一部分的復習數組指針,指針數組和二維指針是前提,前面的不會,後面的沒法理解。這片文章寫的有些費勁,個人能力不夠,可能會有錯誤,希望各位朋友能夠指正,共同進步。//握手

一:先回顧一下數組指針,指針數組,二維指針

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

看到上面的定義方式一一分析
分析(1)
第一步:找核心,核心是p

第二步:由p向外一層分析,p和*結合是指針,再和[]結合,所以int (*p)[5] 是數組指針

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

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

(4)二重指針和指針數組
二重指針就是指針數組指針(有點亂哈)

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

二:二維數組和指針的糾纏

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

符號含義 int a[ 2 ][ 5 ];int a[ i ] [ j ];

跟著思路一步一步走

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

那麽第一個問題來了

兩個數組的數組名是誰?

對,a[ i ]和a[i+1] 既然a[ i ]和a[ i+1 ] 是一維數組名

那麽第二個問題來了?

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

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

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

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

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

二維數組的運算
int b[ 10 ];
下標訪問b[ 1 ]
指針訪問* ( b+1)

int a[ 2 ] [ 10 ]
下標訪問a[ 1 ] [ 1 ]
指針訪問* ( * (a+1)+1)

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

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

二維數組比較難理解,難道真的是只可意會不可言傳?雖然寫了這篇文章,但總感覺不是很對,以我目前的水平無法找出錯誤,請高手指點。//感謝


本文出自 “13088918” 博客,轉載請與作者聯系!

二維數組和它的指針