如何將二維數組作為函數的參數傳遞

來源:互聯網
上載者:User

如何將二維數組作為函數的參數傳遞

  今天寫程式的時候要用到二維數組作參數傳給一個函數,我發現將二維數組作參數進行傳遞還不是想象得那麼簡單裡,但是最後我也解決了遇到的問題,所以這篇文章主要介紹如何處理二維數組當作參數傳遞的情況,希望大家不至於再在這上面浪費時間。

本文:

 

  首先,我引用了譚浩強先生編著的《C程式設計》上面的一節原文,它簡要介紹了如何

將二維數組作為參數傳遞,原文如下(略有改變,請原諒):

 

  [原文開始]

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

    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.