1. 程式人生 > >c語言多維陣列與指標

c語言多維陣列與指標

一.前言:

對於陣列想必大家都不陌生首先得要知道的是對於陣列元素在記憶體儲存是連續性的

例如:

char a[10]    //那麼陣列a的各個原數在記憶體中的儲存地址為:0X01~0X10

而一維陣列相對於多維陣列來說很簡單的,然而陣列a就表示的是整個陣列記憶體段的首地址也就是0X01,那可可想而知變數a存得值就是一個地址,到此不難看出a就是一個指標。。。(不理解的可以看看我之前呢寫的有關指標的介紹就清楚了此處不再重複解釋)。

對於a存放的地址和&a的地址有啥區別了?

    int c[10];
    int(*p)[10];  //定義一個指向10個int寬度的指標
    p = &c;
    printf("c的地址:%p\n",c);
    printf("&c的地址:%p\n", &c);
    printf("p存的地址:%p\n", p);

結果:

重結果可以看出a存的地址等於&a的地址(指標a的地址),可是他們真的完全一樣嗎?打那是不完全一樣。例如:


    char c[10];
    char(*p)[10];
    p = &c;
    printf("c的地址:%p,c+1的地址為:%p\n",c,c+1);
    printf("&c的地址:%p,&c+1的地址為:%p\n", &c,&c+1);
    printf("p存的地址:%p,P+1存的地址為:%p\n",p, p+1);

結果:

這裡說明了雖然&a的地址和a存的地址相同都為首地址但是兩者意義不一樣&a表示整個陣列地址a表示首元素地址,同理如果要接收整個陣列地址要用指向10資料寬度的指標即 char(*p)[10];

注意:陣列字母雖然表示指標但是他是不能修改的左值即不能執行++運算等。

二.二維陣列和多維陣列。

儲存方式:

一維儲存方式:

表示每個元素佔據一個記憶體單元。

二維陣列:char a[3][6]

從儲存單眼我們可以看出:二維陣列中存有3個一維陣列並且這三個一維陣列都是含有6個char型的陣列。

由此可以看出多維陣列實際上就是由多個一維陣列構成。

例如:char a[2][2][2]:表示陣列a中有2個元素,這兩個元素又由2個元素構成,這三個元素又包含了2個char型元素表示為:

{{{{},{}},{{},{}}},{{{},{}},{{},{}}}}

二維陣列和指標:

同理二維陣列名指向的是陣列中每一個一維陣列。例如  char a[2][2]  a指向第一個元素地址即是:&a[0][0]地址

總之陣列名錶示的是整個陣列中最外層的資料元素如果是二維陣列那麼他表示的就是第一層的表示一維陣列的元素項,若要繼續項內層訪問就要*a解引用。

注意:a[1]等價於*(a+1)是一個指標的解引用可能是地址也可能是數。

          a[1][1]等價於*(*(a+1)+1)而&a[1]代表二維陣列第二個人元素項的地址實際上a[1]可以用一個一個一級指標接收。

對於該用什麼指標接收實參具體得看傳進來的內容是什麼。。。。