二維陣列指標

2021-06-25 12:29:07 字數 752 閱讀 6405

一道面試題:

已知 inta[3][4];則下列能表示a[1][2]元素值的是()

a、*(*(a+1)+2)  

b、*(a+1+2)    c、(&a[0]+1)[2]    d、*(a[0]+1)

這題似乎一看應該選 a,c 兩個項。但正確的結果只有 a;

c中的寫法通不編譯。寫成這樣:(int*)(&a[0] + 1)[2] 可通過編譯,結果也是正確的。

讓我們來分析一下,為什麼 (&a[0] + 1)[2] 編譯出錯。

首先,&a[0] + 1 應該是乙個陣列的位址,應該用乙個陣列指標去儲存這個位址,確切地說:

int (*parray) [4] = &a[0] + 1;//ok

parray[2]//no,因為 parray 是乙個陣列指標,而編譯器遇到 parray[2] 會這樣看待:*(parray + 2)

//而 parray 指代的是陣列,於是編譯器會報如下錯誤:cannot convert from 'int [4]' to 'int'

正確的通過陣列指標得到 a[1][2] 的方法是:

(*parray)[2];// *parray 先對陣列位址指標解引用,得到陣列,再通過 [2] 得到結果。

我們還遺留乙個問題沒有回答,為什麼 ((int*)(parray))[2] 也可以得出結果呢?下面一幅圖對原理予以解釋。

二維陣列 二維陣列和指標

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到底指向幾個指標是不知道的...