1. 程式人生 > >定義接受二維陣列作為實參的形參時,定義時可以省略二維陣列的行數,但不能省略列數。

定義接受二維陣列作為實參的形參時,定義時可以省略二維陣列的行數,但不能省略列數。

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

    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

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

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