要清楚的理解多維數組,需要先理解指針的算術運算和數組名的含義。
1、指針的算術運算
指針的算術運算與普通的類型的算術運算是不同的,編譯器會在指針的算術運算的過程中自動乘以sizeof(type),如int p=1;p=p+2;則p=3;而int *p; (假如p指向的初始地址位2000),那么p=p+2;實際上指向的是2000+2*sizeof(int),32位系統下的結果為2008。
2、多維數組名字的理解
對於數組名大家都知道可以理解為指針,可究竟這個指針指向的內容是什么呢?這個我沒法直接說清楚,直接對着例子說吧
如:定義了下面的一個三維數組,那么num當做指針的話它指向的內容是什么呢,其實它可以理解為只有三個元素的一維數組,num[3]={a[4][5],b[4][5],c[4][5]};而a,b,c為三個4行5列的二維數組a[4][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}};
b[4][5]={{21,22,23,24,25},{26,27,28,29,30},{31,32,33,34,35},{36,77,88,39,40}}
c[4][5]={{41,42,43,44,45},{46,47,48,49,50},{51,52,53,54,55},{56,57,58,59,60}}
int num[3][4][5]={{{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}}, {{21,22,23,24,25},{26,27,28,29,30},{31,32,33,34,35},{36,77,88,39,40}}, {{41,42,43,44,45},{46,47,48,49,50},{51,52,53,54,55},{56,57,58,59,60}}};
綜上,num是一個指向{{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}}元素的指針,而不是指向1的指針,雖然他們的地址相同,但是num+1可就不同了,根據對指針運算的理解,num+1之后num的值應為:原地址值+sizeof(num),如果上述分析正確的話,執行num+1之后,num應為:原地址值+sizeof(int)*4*5,即32為系統下num+1的值應比num的值多80,而不是4,下面通過程序驗證下:
#include<iostream> using namespace std; int main() { int num[3][4][5]={{{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}}, {{21,22,23,24,25},{26,27,28,29,30},{31,32,33,34,35},{36,77,88,39,40}}, {{41,42,43,44,45},{46,47,48,49,50},{51,52,53,54,55},{56,57,58,59,60}}}; int addr1=(int)num; int addr2=(int)(num+1); cout<<addr1<<endl<<addr2<<endl; return 0; }
理解上面的內容就可以對多維數組進行操作了,如定位到23這個元素,首先要先通過*(num+1)定位到{{21,22,23,24,25},{26,27,28,29,30},{31,32,33,34,35},{36,77,88,39,40}},然后在對其*()即*(*(num+1))定位到{21,22,23,24,25},然后在*(+2)即*(*(*(num+1))+2)定位到23。
3、用數組名作為一維指針去操作多維數組
其實多維數組只是為了方便程序員編程,而設定的,在內存中多維數組就是一個一維數組,它是按照從左到右一個元素一個元素線性排列的,如上述num數組中的元素就是按照從1到60排序的。使用時需要先找到多維數組中第一個元素的地址,然后將其賦值給一維指針,如int *p=&num[0][0][0];或int *p=num[0][0];
#include<iostream> using namespace std; int main() { int num[3][4][5]={{{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}}, {{21,22,23,24,25},{26,27,28,29,30},{31,32,33,34,35},{36,77,88,39,40}}, {{41,42,43,44,45},{46,47,48,49,50},{51,52,53,54,55},{56,57,58,59,60}}}; int addr1=(int)num; int addr2=(int)(num+1); cout<<addr1<<endl<<addr2<<endl; cout<<*(*(*(num+1))+2)<<endl; int *p=&num[0][0][0]; int *q=num[0][0]; cout<<*(p+22)<<endl; cout<<*(q+22)<<endl; return 0; }