首先 指標式分級別的 *p是一級指標 **p是二級指標
比如我們定義
int a[5];
int *p;
此時 a作為陣列中第乙個元素的位址 是乙個一級 指標, 所以 直接 p=a 就可以
若要得到第n個元素 只需 *(p+n)
下面主要討論二維陣列與指標
int a[3][3]=,,};
int *p;
int (*p)[3];
陣列a是乙個二維陣列,其在記憶體中的儲存方式 是順序儲存的,如果我們用p訪問任意乙個元素的話 有如下方法 比如訪問a[2][2];
1.p=&[0][0]; *(p+2*3+2);
2.p=a[0]; *(p+2*3+2);
但是不能使用 p=a;
首先對於上面的二維陣列a 可以看做 陣列a有三個元素; 其中每個元素為乙個包含3個值的陣列, 所以 a其實是a[0]的位址,a+1 是a[1]的位址
這樣*a 就得到了a[0]的內容 而a[0]是乙個有三個元素的陣列 的首元素的位址,所以再*a[0] 才得到1; 從這個過程來看 a是乙個二級指標,顯然不能直接賦值給p
*a與a[0]等價、*(a+1)與a[1]等價、*(a+2)與a[2]等價
由此,對於陣列元素a[i][j],用陣列名a的表示形式為:
*(*(a+i)+j)
指向該元素的指標為:
*(a+i)+j
對上述二維陣列a,雖然a[0]、a都是陣列首位址,但二者指向的物件不同,a[0]是一維陣列的名字,它指向的是a[0]陣列的首元素,對其進行「*」運算,得到的是乙個陣列元素值,即a[0]陣列首元素值,因此,*a[0]與a[0][0]是同乙個值;
而a是乙個二維陣列的名字,它指向的是它所屬元素的首元素,它的每乙個元素都是乙個行陣列,因此,它的指標移動單位是「行」,所以a+i指向的是第i個行陣列,即指向a[i]。對a進行「*」運算,得到的是一維陣列a[0]的首位址,即*a與a[0]是同乙個值。當用int *p;定義指標p時,p的指向是乙個int型資料,而不是乙個位址,因此,用a[0]對p賦值是正確的,而用a對p賦值是錯誤的。這一點請讀者務必注意。
C 二維陣列與指標
從鍵盤輸入r行c列二維整型陣列,找出每一行的次最大值並顯示出來。要求 1 r和c為符號常量 2 二維陣列是動態申請生成的 3 每一行的次最大值是利用單獨的函式呼叫獲得的 4 對陣列元素的訪問以及函式引數宣告等都是利用指標實現的。include stdio.h include iostream inc...
二維陣列與二維指標
1.二維陣列的儲存是線性的,可以通過一維指標的方式訪問。如一下 int map 5 5 int mapd map 0 0 則 map i j mapd i 5 j 而利用二維陣列線性儲存的特性,可以將二維陣列當作一維指標方便的在函式之間傳遞 如 將乙個二維陣列賦值給乙個動態二維陣列,引數設定為一維指...
二維陣列與二維指標
一.指標與二維陣列 以martix 3 4 為例 1.二維陣列的本質 int martix 3 4 int martix 3 4 int 4 martix 3 令int 4 為type,type martix 3 為含有三個元素的陣列,每乙個元素型別為int 4 int 4 是乙個擁有4個int型別...