網路城邦
上一篇 回創作列表 下一篇   字體:
c語言:到底多維陣列的pointer該怎麼寫?
2008/09/07 16:01:04瀏覽10670|回應2|推薦1

到底多維陣列的pointer該怎麼寫?
    
寫過c語言的人,一定會碰到一種寫法:
    char Key_A[2][3] = {....};
    char Key_B[4][3] = {....};
    
注意兩個陣列大小不同,陣列很方便,可以使用很少的指令來做動作,同時速度還很快,可以使用迴圈來做處理,好處多多。
    
可是如果有狀態判斷時怎麼辦?例如這個狀態要使用Key_A,另一個狀態要使用Key_B,一維陣列的pointer很容易,就是
    char *array;
    
可是二維呢?難道是"char **array",用兩顆星星嗎?當然不是,兩顆星星意思是["array"指到的內容是"char*"],可是如果不知道怎麼寫,那就只有硬拼了:
    if(status)
        Key_A[][]....
    else
        Key_B[][]....
    
當然這樣也可以,程式碼只要會動會穩定就是80分了,只不過如果大量參考到這個陣列,或是有一天新增其他類似陣列的時候,維護上面的if...else就麻煩了,同時又如果是好幾份程式檔案要參考到這個陣列,那有的改了,到處都是ifelse,穩定性就垂直下降,所以還是使用正式的作法比較好,那該怎麼寫呢?
    char (*array)[3];
    
這樣的寫法就可以了,所以程式碼的結構可以是:
    array = status ? Key_A : Key_B;
    for(....)
    {
        for(...)
        {
            array[index_1][index_2]......
        }
    }
    
如果是三維陣列呢?雖然很少用到,也不建議用,因為陣列過大,光安排就是個麻煩,不過還是提供給大家:
    char Key_A[4][3][2];
    char Key_B[5][3][2];
    char Key_C[6][3][2];
   
    char (*array)[3][2];
    ....
    array[index_1][index_2][index_3] = .....
    ....
    
結構大致如上,變化一下就可以了,要注意陣列大小只有第一個括弧可以不同,其餘的一定要相同,如[3][2],至於為什麼就要自己想一下了。
    
這些東西,大概因為很容易,所以很多書都沒教,很多人也不願意講,不過沒關係,在這裡提供給有緣人參考一下......

( 心情隨筆心情日記 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=cchahacaptain&aid=2197712

 回應文章

LD
三維指標舉陣
2010/03/10 20:46

大大您好,

請問那三維的指標矩陣3X3X3我這樣寫也OK吧?

 

char ***temp = new char **[3];

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

        temp[i] = new char *[3];

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

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

                    temp[i][j] = new char [3];

彼得鄧(cchahacaptain) 於 2010-03-13 02:26 回覆:

C++我幾乎沒用過,所以如果我解釋錯誤,請別見怪!
而上面的程式,temp[]只有3塊空間,應該沒辦法存取temp[][],所以要使用多維陣列,直接new一個多維陣列即可

.
一個陣列,基本上是指一整塊連續的記憶體,假設宣告ARRAY[2][3],我們在ARRAY[1][1]中存取,實際上來說,是以ARRAY為區段,存取索引值第2x2=4個單元裡面的東西,為什麼會這樣呢?因為以目前一般的計算機硬體結構來說,只有一維陣列,無論是DRAM或硬碟都是一維陣列,陣列的宣告只是告訴compiler寫程式的人要怎麼看待這塊記憶體,是為了讓寫程式的人管理更方便。
.

new與malloc是屬於執行期間動態配置,在embedded system上使用要特別小心,compiler內有一個選項叫做heap memory,就是設定memory allocation記憶體大小,當我們使用new或malloc得到的pointer就是從這塊記憶體刮出來的,設大了浪費,小了有爆掉的危險,不使用也可以關閉。
.

因為目前來說embedded system記憶體比較不足,記憶體管理也沒那麼聰明,且動態分配會造成記憶體斷離的問題,是有配置失敗的可能發生,一般來說embedded system是有可能放置在不容易取得的地方,例如某圍牆頂端,假設此時機器某個task死掉,watch dog機制也不夠完整,那要reset就不是那麼容易了。
.

不過有時設計出某些api一定要有open,close等等的動作,就一定會使用到動態配置,所以也不用對記憶體動態配置視若洪水猛獸,該考慮的都考慮到就好了!


ABC
多謝~~
2008/09/10 00:09

寫的很清楚

如果能有完整的程式就更好了