關於二維陣列和指向指標的指標

2022-05-26 19:24:04 字數 1620 閱讀 4087

以前一直有種誤解:

二維陣列的是陣列的陣列,所以陣列的首位址是指向第乙個元素指標,而這個元素又是乙個陣列,所以把陣列首位址理解為指向指標的指標。

如int a[3][2];,以前一直認為a是乙個指向int指標的指標,即是乙個int**。最近發現這是錯的。

如果int **p=a; 編譯就會報錯。如果強制轉換int **p=(int **)a,則使用p[i][j]訪問陣列元素時出錯。

首先,因為a的定義為 int a[3][2];則a的型別是int* [3][2]陣列型別,或者int* [2],即指向大小為2的陣列的指標,型別與int **不同,所以int **p=a;出錯。

其次,考慮p[i][j]訪問a的陣列元素時出錯的問題。當我們使用指向二維陣列的指標的下標運算來訪問陣列元素時,如a[i][j],它等同於*(a+i*2+j);即必須要知道第二維的大小才能訪問。考慮我使用p[i][j]的後果:

p是int**,所以p[i]為*(p+i),而這個結果被視作乙個指標,在這裡記做pp=*(p+i),所以p[i][j]等同於pp[j]。最終的結果為*(pp+j),並將這個結果解釋為乙個int值。

int a[3][2];

int val=0;

for(int i=0;i<3;++i)

}/*使用a[i][j]的方式顯然可以正常訪問該二維陣列*/

/*下面使用指標直接訪問,當然是不是int**了……*/

int *p=&a[0][0];/*注意,此處使用int *p=a;或者int *p=a[0];是不對的,p的型別是int型指標a或者a[0]是int (*)[2]型別,編譯會報錯的,*

*儘管&a[0][0]、a、a[0]的數值相同……*/

for(int i=0;i<6;++i)

/*下面看看int**型的指標吧……*/

int **pa=(int **)a;/*a、pa型別不同,不強制轉換編譯會報錯*/

/*下面執行時出錯……*/

for(int i=0;i<3;++i)

}int a[3][2];

int val=0;

for(int i=0;i<3;++i)

}/*使用a[i][j]的方式顯然可以正常訪問該二維陣列*/

/*下面使用指標直接訪問,當然是不是int**了……*/

int *p=&a[0][0];/*注意,此處使用int *p=a;或者int *p=a[0];是不對的,p的型別是int型指標a或者a[0]是int (*)[2]型別,編譯會報錯的,*

*儘管&a[0][0]、a、a[0]的數值相同……*/

for(int i=0;i<6;++i)

/*下面看看int**型的指標吧……*/

int **pa=(int **)a;/*a、pa型別不同,不強制轉換編譯會報錯*/

/*下面執行時出錯……*/

for(int i=0;i<3;++i)

} 上面最後一部分pa[i][j]出錯的原因如下:

如上所述:p[i]是*(p+i),即在p處移動i個型別單位大小(p的型別是int**,通常指標都是32位值吧……多數情況正好和int大小相同),所以正好移動i個int大小,假設i=0,j=1,則p[i]是0;那麼p[i][j]就是0[1],相當於將位址4的值取出來解釋為為int ,位址4當然不允許使用者程式訪問,所以執行時錯誤……

實驗8二維陣列

一 實驗目的 1 掌握二維陣列的定義 賦值和輸入輸出方法 2 學會如何應用二維陣列解決問題 二 實驗內容 1 將兩個給定的距陣 3 3 相乘得到另乙個距陣並將其列印出來。其中提示 1 定義三個陣列a 3 3 b 3 3 c 3 3 先分別輸入a b兩個陣列的元素值。2 計算則應設計乙個三重巢狀迴圈,...

二維陣列程式設計實驗報告

實驗報告 一 實驗目的 1 掌握二維陣列的定義 賦值 輸入和輸出及二維陣列元素的引用方法。2 掌握二維陣列的相關演算法 矩陣行列互換 矩陣中特定資料的查詢 3鞏固迴圈巢狀的使用。4 學習vc環境下除錯二維陣列程式的方法。二 實驗內容 1 輸入5 5的陣列,編寫程式實現 1 求出對角線上各元素的和 2...

二維動畫總結

二維動畫心得 時光如流水般逝去,二維動畫課程就這樣過去了,在這段時間裡我和同學 校友們 某某們 老師們相處的萬分愉快,而我也從他們的身上學到了我以前在書本裡沒有的知識。不過這知識永遠都不會出現在課本裡面,在這裡是緣分讓我們從五湖四海相遇。記得剛進學校,那時我對這個專業還什麼都不懂。開始接觸我模糊 陌...