• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 200, comments - 8, trackbacks - 0, articles - 0

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

                  下文是我從互聯網上download的一篇文章,講的很好,但是我后面將指出問題所在,并加以改進,希望對你有所幫助:

              首先,我引用了譚浩強先生編著的《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);

              其實多維數組和二維數組原理是一樣的,大家可以自己擴充的多維數組,這里不再贅述。寫到這里,我先向看了這篇文章后悔的人道歉,浪費你的時間了。下面是一個完整的例子程序,這個例子程序的主要功能是求一個圖中某個頂點到其他頂點的最短路經,圖是以鄰接矩陣的形式存放的(也就是一個二維數組),其實這個函數也是挺有用的,但是我們這篇文章的重點在于將二維數組作為函數的參數傳遞。

                上文結束,上文最后指出了實現二位數組作為函數參數的方法,但是它實現的是將靜態的二位數組作為參數,但是如何將動態而為數組作為參數呢?上面的方法顯然是不合適的,下面是我琢磨出來的方法。

                先將靜態數組作為參數的代碼貼出來:

            #include <iostream>
            using namespace std;

            void Calc(int **A, int m, int n);

            int _tmain(int argc, _TCHAR* argv[])
            {
                int row = 0;
                int col = 0;
                int i = 0;
                int A[3][3];
                
                for (row = 0; row < 3; row++)
                {
                    for (col = 0; col < 3; col++)
                    {
                        A[row][col] = row + col;
                    }
                }
                Calc((int **)A, 3, 3);
                return 0;
            }

            void Calc(int **A, int m, int n)
            {
                if (NULL == A || m <1 || n < 1)
                {
                    return;
                }

                int row = 0;
                int col = 0;
                int i = 0;
                int j = 0;
                int **matrix = NULL;
                matrix = new int*[m];
                if (NULL == matrix)
                {
                    return;
                }
                for (row = 0; row < m; row++)
                {
                    matrix[row] = new int[n];
                    if (NULL == matrix[row])
                    {
                        for (i = 0; i < row; i++)
                        {
                            delete []matrix[i];
                            matrix[i] = NULL;
                        }
                        delete []matrix;
                        matrix = NULL;
                        return;
                    }
                }
                for (row = 0; row < m; row++)
                {
                    for (col = 0; col < n; col++)
                    {
                        matrix[row][col] = *((int *)A + row * n + col);
                        //matrix[row][col] = A[row][col];
                    }
                }
                
                
                for (row = 0; row < m; row++)
                {
                    for (col = 0; col < n; col++)
                    {
                        cout<<matrix[row][col]<<"  ";
                    }
                    cout<<"\n";
                }
            }

            下面是動態二位數組作為函數參數時的代碼:

            #include <iostream>
            using namespace std;

            void Calc(int **A, int m, int n);

            int main(int argc, char* argv[])
            {
                int row = 0;
                int col = 0;
                int i = 0;
                int **A = NULL;
                A = new int*[3];
                if (NULL == A)
                {
                    return 0;
                }
                for (row = 0; row < 3; row++)
                {
                    A[row] = new int[3];
                    if (NULL == A[row])
                    {
                        for (i = 0; i < row; i++)
                        {
                            delete []A[i];
                            A[i] = NULL;
                        }
                        delete []A;
                        A = NULL;
                        return 0;
                    }
                }
                
                for (row = 0; row < 3; row++)
                {
                    for (col = 0; col < 3; col++)
                    {
                        A[row][col] = row + col;
                    }
                }
                Calc((int **)A, 3, 3);
                return 0;
            }

            void Calc(int **A, int m, int n)
            {
                if (NULL == A || m <1 || n < 1)
                {
                    return;
                }

                int row = 0;
                int col = 0;
                int i = 0;
                int j = 0;
                int **matrix = NULL;
                matrix = new int*[m];
                if (NULL == matrix)
                {
                    return;
                }
                for (row = 0; row < m; row++)
                {
                    matrix[row] = new int[n];
                    if (NULL == matrix[row])
                    {
                        for (i = 0; i < row; i++)
                        {
                            delete []matrix[i];
                            matrix[i] = NULL;
                        }
                        delete []matrix;
                        matrix = NULL;
                        return;
                    }
                }
                for (row = 0; row < m; row++)
                {
                    for (col = 0; col < n; col++)
                    {
                        //matrix[row][col] = *((int *)A + row * n + col);
                        matrix[row][col] = A[row][col];
                    }
                }
                
                
                for (row = 0; row < m; row++)
                {
                    for (col = 0; col < n; col++)
                    {
                        cout<<matrix[row][col]<<"  ";
                    }
                    cout<<"\n";
                }
            }
                注意上面的代碼的不同之處,即將動態二維數組作為函數參數時,在函數里面應用時候要將其偽裝成靜態二維數組!

                這樣,以上的兩段代碼不僅實現了堆和棧之間數據的傳遞,而且實現了堆和堆之間數據的傳遞!

            亚洲精品乱码久久久久久中文字幕 | 久久ww精品w免费人成| 99麻豆久久久国产精品免费| 99久久国产综合精品五月天喷水| 午夜精品久久久内射近拍高清| 久久久无码精品亚洲日韩按摩| 久久久久久久国产免费看| www久久久天天com| 亚洲v国产v天堂a无码久久| 欧美日韩中文字幕久久伊人| 国产精品一区二区久久精品涩爱 | 欧美一级久久久久久久大| 2022年国产精品久久久久| 久久精品国产亚洲αv忘忧草| 国产亚洲色婷婷久久99精品91| 久久精品欧美日韩精品| 久久久噜噜噜久久中文字幕色伊伊| 久久国产精品免费一区| 国产精品岛国久久久久| 久久天天躁狠狠躁夜夜avapp| 久久人人爽人人爽人人片AV东京热| 久久精品国产福利国产琪琪| 色综合合久久天天综合绕视看| 精品熟女少妇a∨免费久久| 久久午夜无码鲁丝片| 久久婷婷五月综合97色一本一本| 久久人妻无码中文字幕| 99久久精品国产一区二区| 久久久无码精品亚洲日韩京东传媒 | 色妞色综合久久夜夜| 久久夜色精品国产噜噜麻豆| 久久Av无码精品人妻系列| 久久亚洲精品国产精品| 999久久久免费精品国产| 99久久er这里只有精品18| 91久久精品国产成人久久| 国产午夜福利精品久久| 无码任你躁久久久久久| 欧美精品久久久久久久自慰| 狠狠色噜噜狠狠狠狠狠色综合久久| 亚洲国产二区三区久久|