如何理解二維陣列元素的位址?
要知道,這本書用了整整兩頁的內容來講解這方面的知識,從這裡足以看出來理解通過指標來引用二維陣列是一件比較麻煩的事情,但是我認為理解並不難。一.陣列名a和
&a[i]
二.a+i是什麼?1.a+i與三.a[i]+j是什麼?&a[i]
(實際上是&a[i][0])等價。2.
*(a+i)
與a[i]等價(二者都是位址)。
1.a[i]+j與&a[i][j]
等價2.
*(a[i]+j)
與a[i][j]等價3.由上文二.2和三.2的等價關係可得:
*(*(a+i)+j)
與a[i][j]等價。
理解上面很抽象的內容是不是很痛苦呢,我在接觸指標的時候也繞了很多彎路,這裡給大家的建議還是放慢腳步,多回歸課本,不急於求成。
*
與&
的故事1.在(a+i)(指標)前面加上乙個我們再回到二維陣列指標的基型別*
,*(a+i)
就是a[i]
(指標),那麼*(a+i)+j
就是a[i]+j
,指向a[i][j]
。2.在
a[i]
(指標)前面加上乙個&
,&a[i]
就是(a+i)(指標),那麼&a[i]+j
就是(a+i)+j
,指向a[i+j]
。3.以上是指標到指標的變化。
在多維陣列中,指標變數有兩種型別:1.指向陣列元素的指標變數和2.指向n個元素組成的一維陣列的指標變數關於指向陣列元素的指標變數,相信大家在複習前面的內容以後都好理解,這裡來看乙個例子。
#include
int main()
,,};
int i;
p=a[0];/*p初始化指向a[0][0]*/
for(p=a[0];p
12;p++)
printf("
%d",*p);
return0;
}
輸出結果:上面是按順序輸出陣列各元素的值,這裡介紹如何輸出某個指定的數值元素。
假設有乙個n×m的二維陣列,計算
a[i][j]
在陣列中的相對位置:i*m+j
其中m是n×m矩陣的列數。那麼
a[i][j]
的位址就等於&a[0][0]+i*m+j
#include
int main()
,,};
int*p=a[0];/*或者:int *p=&a[0][0]*/
/*要求:輸出a[1][2]的值*/
/*法1:printf("
%d",*(a[1]+
2));*/
/*法2:printf("
%d",*(*(a+1)+
2));*/
printf("
%d",*(p+1
*4+2));/*法3:利用相對位置*/
return0;
}
再來看指向一維陣列的指標變數。
int a[3][4]=,,};
int (*p1)[4];/*這個定義指標的方式在下文會提到,注意它和定義指標陣列(int
*p1[4])的區別*/
int*p2;
p1=a;/*指標p1指向一維陣列a[0]*/
p2=a[0];/*指標p2指向陣列元素a[0][0]*/
在上面的**3裡,p1是指向一維陣列指向一維陣列指標的定義a[0]
的指標,p2是指向陣列元素a[0][0]
的指標。a[0],a[1],a[2],p2的基型別是
int *
型(指向整形變數)而二維陣列名a,p1的基型別是
int(*)[4]
(指向包含四個整形元素的一維陣列)。下面介紹指向一維陣列指標的定義方法。
上文中的**1定義的指標變數p是指向變數或者陣列元素,現在定義指向一維陣列的指標。
#include
int main()
,,};
int (*p)[4];/*定義指向一維陣列的指標p*/
int i,j;
p=a;/*不能寫成p=&a;*/
for(i=
0;i<
3;i++)
return0;
}
輸出結果:此時,**段
p=a;
把a[0]
(一維陣列)的位址賦值給p(該一維陣列的初始位址&a[0][0]
)。
#include
int main()
;int (*p)[4];
p=a;/*錯誤*/
printf("
%d",(*p)[3]);/*輸出a[3]*/
return0;
}
編譯錯誤,我們定義指向一維陣列的指標p,p只能指向一維陣列,而這裡的錯誤是把一維陣列a的首元素位址賦值給了p,從而p指向了a[0],即指向了整形元素。正確的賦值方法應該是:
p=&a;
關於*和&
請看上文。
C語言 指標篇(二)陣列指標
先介紹一下概念 陣列指標,表示指向陣列的指標,或者說指標指向的是陣列!先上 int main 首先,我們定義乙個二維陣列,m是二維陣列的陣列名,也是陣列的首位址,相當於二級指標常量。p是個指標變數,指向乙個包含2個元素的一維陣列,且p的增量以它所指向的一維陣列的長度為單位。比如,p i m i 0 ...
c語言與程式設計筆記 指標篇 (1)
基本概念 1 運算元 稱為間接訪問表示式,它的操作語義是引用以運算元為位址的變數。運算元可以是表示式,但其值必須是位址值。所以間訪表示式的值是乙個左值,代表指標所指的變數。而指標所指的型別就是間訪表示式運算的型別。例 int y,x 3 pi x y pi 是先對pi進行 操作,然後計算px,即對p...
重拾C語言之指標篇(二)
指標與函式引數傳遞 c語言在傳遞引數時,會預設為形參分配新的記憶體空間,形參只有在被呼叫時才分配記憶體 單元,在呼叫結束時,即刻釋放所分配的記憶體單元。void main void change int i 我們可以看到,呼叫change 方法後並沒有改變i的值,我們可以把main方法和change...