指標訪問二維陣列

2021-06-20 10:24:32 字數 2262 閱讀 2170

之前對陣列的概念一直沒有理解透徹,只覺得陣列名就是個常量指標而已,用法和基本的指標差不多。所以當我嘗試用二級指標去訪問二維陣列時,就經常會出錯。下面就是剛開始寫的乙個錯誤的程式:

#include int main()

,}; int **parray = null;

parray = iarray;

printf("

array[0][0] = %d\n

", parray[0][0]);

printf("

array[1][2] = %d\n

", parray[1][2]);

return

0;}

開始的時候我是這樣分析的:本來陣列和指標就差不多,一維陣列和一維指標對應,那麼二維陣列名應該和二維指標差不多,所以上面那個程式是沒有錯的,應該列印出的是1和6。但是當我實際編譯執行的時候,卻出現了段錯誤,也就是我訪問了不該訪問的位址空間。那錯誤到底出在什麼地方呢?正確的程式應該怎麼寫呢?

為了解決問題,不得不讓我重新理解陣列的含義。仔細翻閱一些書籍後,我發現其實陣列並不是我原來想象的那麼簡單:乙個常量指標標識的一群變數的集合。陣列應該也算是乙個完備的變數型別:有名字,有大小,也有位址。只不多就是名字和它的位址一樣罷了。也正是因為陣列有大小,所以當用sizeof對陣列名進行運算時,算出來的是實際陣列的大小,而不是指標的大小。

也正是因為這樣,所以指向陣列的指標和指向指標的指標也大不一樣。它們倆最明顯的不同就是表現在指標步進的時候。我們知道指標在進行++運算的時候,跨越的實際位址取決於指標指向的資料型別:對於一般的32位機來說,假如指向的是int型資料,跨越的實際位址就是4,指向的是指標型資料,跨越的實際位址也是4,當指向的是陣列型別的時候,跨越的實際位址就是陣列的長度了。

現在再回頭分析上面那個錯誤程式,根據下標引用符號的運算規則,我們知道parray[0][0]其實就是**parray,而iarray實際上只是個陣列變數名,而它的值就是整個陣列的開始位址(其實&iarray,iarray,iarray[0]以及&iarray的值都是陣列的開始位址,都是在編譯過程中編譯器賦予的值)。那麼其實*parray就已經是iarray[0][0]的值了,也就是1,而**parray則是去訪問位址為1的位址空間中的資料,自然會出段錯誤。

其實用指標訪問二維陣列可以直接用一級指標就可以了。比如下面這個程式:

int main()

,}; int *parray = null;

parray = iarray;

printf("

array[0][0] = %d\n

", *parray);

printf("

array[1][2] = %d\n

", *(parray + 1 * 3 + 2));

return

0;}

因為陣列本身在位址空間中就是連續排列的,根據行數和列數,我們自己計算出訪問單元的位址偏移量就可以用一級指標輕鬆遍歷二維陣列中的所有資料了。

我們還可以嘗試用指向陣列的指標來訪問二維陣列的成員。下面就是事例程式:

int main()

,}; int (*parray)[3] = null;

parray = iarray;

printf("

array[0][0] = %d\n

", parray[0][0]);

printf("

array[1][2] = %d\n

", parray[1][2]);

return

0;}

簡單分析一下這個程式:我們知道運算子的結合方向是由左向右,parray[1][2]就等價於(* (parray + 1))[2],而由於parray是陣列指標,而且陣列的長度為3,所以* (parray + 1)就表示iarray[1]這個陣列,則parray[1][2]則就完全等價於iarray[1][2]。

如果非得想用二級指標來訪問二維陣列的話,我們還得借用指標陣列(陣列內儲存的都是指標型別的資料),下面是事例程式:

int main()

,}; int *iparray[2] = ;

int **parray = null;

parray = iparray;

printf("

array[0][0] = %d\n

", parray[0][0]);

printf("

array[1][2] = %d\n

", parray[1][2]);

return

0;}

二維陣列 二維陣列和指標

include using namespace std int main 如上面這段程式所示,通過取位址符 指標 p 獲得了變數 a 的位址,那麼解引用符 就可以從 p 中得到變數 a 的值。也就是說,p a和 p a是等價的。p 是變數 a 的位址,從 p 中就可以取出 a 的值。反之,能從 p ...

二維陣列與二維指標

1.二維陣列的儲存是線性的,可以通過一維指標的方式訪問。如一下 int map 5 5 int mapd map 0 0 則 map i j mapd i 5 j 而利用二維陣列線性儲存的特性,可以將二維陣列當作一維指標方便的在函式之間傳遞 如 將乙個二維陣列賦值給乙個動態二維陣列,引數設定為一維指...

二維指標和二維陣列

二維指標和二維陣列有三種形式 1,type ptr 2,type ptr或者type prt 3,type prt 三種形式意思相近,也有區別。首先三種形式都能表示二維的資料結構。1,type ptr 表示乙個指向指標的指標 但是在一開始宣告的時候 type ptr ptr到底指向幾個指標是不知道的...