多維數組的理解


要清楚的理解多維數組,需要先理解指針的算術運算和數組名的含義。

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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM