指標 多維陣列 陣列指標 指標陣列

2022-07-12 20:24:26 字數 2320 閱讀 5856

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

#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

]);return0;

}

開始的時候我是這樣分析的:本來陣列和指標就差不多,一維陣列和一維指標對應,那麼二維陣列名應該和二維指標差不多,所以上面那個程式是沒有錯的,應該打 印出的是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

));return0;

}

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

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

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

]);return0;

}

簡單分析一下這個程式:我們知道運算子的結合方向是由左向右,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

]);return0;

}

由於二級指標要跳兩次,所以中間還需要額外的儲存一級指標的空間。所以一般不建議用二級指標去訪問二維陣列。

多維陣列(陣列型別,陣列指標,陣列指標型別)

陣列 int myarray100 myarray是陣列首元素位址,myarray 1 步長是四個位元組 sizeof int myarray是整個陣列的位址,myarray 1 步長是100 sizeof int 400個位元組 typedef int myarraytype 100 myarra...

陣列和指標 指標和多維陣列

指標的值是它所指向物件的位址。位址的表示方式依賴於計算機內部的硬體。許多計算機都是按照位元組編址的,意思時記憶體中的每乙個位元組都按順序編號,這裡,乙個較大的位址通常是該物件的第乙個位元組的位址。因此,使用指標會更加的有效率,能夠很好的處理陣列,陣列表示法其實是在變相的使用指標。include st...

陣列,指標,指標陣列,陣列指標

指標是在32位系統下佔四個位元組,64位系統下佔八個位元組的一種型別,指標指向的內容可以是常量,變數,函式,結構體,指標本身,陣列,等等.一級指標 一級指標常常在函式傳參時使用,可傳的引數有一維陣列,常量指標,函式指標等等都可以 但我們要注意不要在函式中,通過改變形參的指向來達到改變實參指向的效果,...