二維數組名作為實參或者形參

來源:互聯網
上載者:User

可以用二維數組名作為實參或者形參,在被調用函數中對形參數組定義時可以可以指

定所有維數的大小,也可以省略第一維的大小說明,如:
    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];
    這時形參數組只取實參數組的一部分,其餘部分不起作用。

  大家可以看到,將二維數組當作參數的時候,必須指明所有維數大小或者省略第一維的

,但是不能省略第二維或者更高維的大小,這是由編譯器原理限制的。大家在學編譯原理

這麼課程的時候知道編譯器是這樣處理數組的:

  對於數組 int p[m][n];
  如果要取p[i][j]的值(i>=0 && i<m && 0<=j && j < n),編譯器是這樣定址的,它的

地址為:
  p + i*n + j;

  從以上可以看出,如果我們省略了第二維或者更高維的大小,編譯器將不知道如何正確

的定址。但是我們在編寫程式的時候卻需要用到各個維數都不固定的二維數組作為參數,

這就難辦了,編譯器不能識別阿,怎麼辦呢?不要著急,編譯器雖然不能識別,但是我們

完全可以不把它當作一個二維數組,而是把它當作一個普通的指標,再另外加上兩個參數

指明各個維數,然後我們為二維數組手工定址,這樣就達到了將二維數組作為函數的參數

傳遞的目的,根據這個思想,我們可以把維數固定的參數變為維數隨即的參數,例如:

    void Func(int array[3][10]);
    void Func(int array[][10]);
  變為:
    void Func(int **array, int m, int n);

  在轉變後的函數中,array[i][j]這樣的式子是不對的(不信,大家可以試一下),因為

編譯器不能正確的為它定址,所以我們需要模仿編譯器的行為把array[i][j]這樣的式子

手工轉變為

    *((int*)array + n*i + j);

    在調用這樣的函數的時候,需要注意一下,如下面的例子:
    int a[3][3] =
    {
      {1, 1, 1},
      {2, 2, 2},
      {3, 3, 3}
    };
    Func(a, 3, 3);

  根據不同編譯器不同的設定,可能出現warning 或者error,可以進行強制轉換如下調用

: 
    Func((int**)a, 3, 3);

  其實多維陣列和二維數組原理是一樣的,大家可以自己擴充的多維陣列,這裡不再贅述

。寫到這裡,我先向看了這篇文章後悔的人道歉,浪費你的時間了。下面是一個完整的例

子程式,這個例子程式的主要功能是求一個圖中某個頂點到其他頂點的最短路經,圖是以

鄰接矩陣的形式存放的(也就是一個二維數組),其實這個函數也是挺有用的,但是我們這

篇文章的重點在於將二維數組作為函數的參數傳遞。

   但是使用變長數組又不時這樣了呢?同樣傳遞的都是數組的地址?(誰能解答呢???!!)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.