可以省略二維數組的行數,但不能省略列數:定義接受二維數組作爲實參的形參時

(1)數組的尋址方式

編譯器在處理二維數組時,對於array[m][n]的數組,如果要取特定位置的值,比如array[i][j]處的值,編譯器的尋址方式是

         array + n * i + j

即每行有幾個元素(列的數量)。

(2)內存的分佈

二維數組在內存中的地址排列方式是按行排列的,第一行排列完之後再排列第二行,以此類推。因爲,當給出數組的列數時,通過列數與行數的關係,對於這樣一個數組,就能找找到特定的地址,從而找到值

/////////////////////////////////////////////////

可以用二維數組名作爲實參或者形參,在被調用函數中對形參數組定義時可以指定所有維數的大小,也可以省略第一維的大小說明,如:

    void Func(int array[3][10]);

    void Func(int array[][10]);

    二者都是合法而且等價,但是不能把第二維或者更高維的大小省略,如下面的定義是不合法的:

    void Func(int array[][]);

    因爲從實參傳遞來的是數組的起始地址,在內存中按數組排列規則存放(按行存放),而並不區分行和列,如果在形參中不說明列數,則系統無法決定應爲多少行多少列,不能只指定一維而不指定第二維,下面寫法是錯誤的:

    void Func(int array[3][]);實參數組維數可以大於形參數組,例如實參數組定義爲:

    void Func(int array[3][10]);

    而形參數組定義爲:

    int array[5][10];

    這時形參數組只取實參數組的一部分,其餘部分不起作用。

 

 

        由於編譯器在處理二維數組時,對於array[m][n]的數組,如果要取特定位置的值,比如array[i][j]處的值,編譯器的尋址方式是

         array + n * i + j

        因爲二維數組在內存中的地址排列方式是按行排列的,第一行排列完之後再排列第二行,以此類推。因爲,當給出數組的列數時,通過列數與行數的關係,對於這樣一個數組,就能找找到特定的地址,從而找到值。

         如果只給行而不給列數,那麼對於上述的尋址方式,編譯器便無法正確的工作,因此在寫形參時,需要把二維數組的列數表示出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章