1. 程式人生 > >C語言——指向分陣列的指標

C語言——指向分陣列的指標

指標在C語言中具有舉足輕重的地位,而在陣列中尤其是多維陣列中的應用,更是讓人眼花繚亂。下面通過一個小例子來簡單介紹一下二維陣列中的指標。

int a[3][5]={ {1,2,3,4,5}, {6,7,8,9,10},{11,12,13,14,15} };

1. a , *a , **a ;
2. &a[0] , &a[1] , &a[0][0] , &a[1][3] ; 
3. a+1 , a[0]+1 , a[1]+1 , a[1][2]+1 ;
4. *a+1 , *(a+1) , *(a+1)+3 , *(*(a+2)+3) ;
5. *(a[2]+3) ;

首先說明一下陣列元素下標"[ ]"是變址運算子,相當於*(  +  ),即a[2]=*(a+2)。

1、首先是第一組,a是二維陣列名,它表示指向0號分陣列的指標常量,對應的地址位元組值是該二維陣列的首地址位元組值。*a表示0行分陣列名,等價於*(a+0),即為a[0],地址位元組值依然是該二維陣列的首地址位元組值。但a和*a並不等價,它們的基型別位元組數不同。在Dev C++編譯環境中,語句printf("%d,%d,%d\n",sizeof(a),sizeof(*a)),輸出的結果為60,20。所以它們的基型別位元組數分別為60,20。

2、“ & ”是“取地址”運算子,所以&a[0]表示“取0行分陣列的地址”,而a作為二維陣列名,恰好是指向0號分陣列的指標常量,所以 &a[0]=a ;同理,&a[1]表示“取第1行分陣列的地址”,&a[0][0]表示“取0行0列元素所在的地址”,&a[1][3] 表示“取1行3列元素所在的地址”。

3、a表示“0行分陣列的地址”,那麼a+1表示“第1行分陣列的地址”,等價於&a[1];a[0]是0行分陣列名,表示“0行0列元素的地址”,那麼a[0]+1表示“0行1列元素的地址”,等價於&a[0][1]。同理,a[1]+1表示“1行1列元素的地址”。a[1][2]表示“1行2列的元素”,a[1][2]+1表示這個元素本身的值+1。

4、前面講到,*a表示0行分陣列名,它表示“0行0列元素的地址”,則*a+1表示“0行1列元素的地址”。a+1是“1行分陣列的地址”,則*(a+1)表示“1行0列元素的地址”,printf("%x,%x\n",a+1,*(a+1))這條語句輸出的兩個地址值是一樣的,說明1行分陣列的地址的確是0號元素所在的地址。若在*(a+1)前再加一個*,那麼表示取該地址所表示的值,即**(a+1)=6。同理,*(a+1)+3表示“1行3列元素的地址”,*(*(a+2)+3)表示“2行3列元素的值”。

5、層層剖析,a[2]表示第2行陣列名,a[2]+3表示“2行3列元素所在的地址”,*(a[2]+3)表示“2行3列元素的值”,所以*(a[2]+3)=*(*(a+2)+3),因為一開始我們就提到a[2]=*(a+2)

【總結】:

指向多維陣列元素的指標變數與指向基型別的指標變數相同。

指向多維陣列的分陣列的指標變數,應該指向整個一級分陣列,基型別位元組數為一級分陣列所佔位元組數。

當對上述例子中的a進行+1操作時,是對a的下一級分陣列進行+1;對a進行*運算時,表示進入下一級分陣列。