如何將二維陣列作為函式的引數傳遞

2021-06-19 20:03:17 字數 775 閱讀 8503

人總是在不經意間犯錯,眼高手低,自負自滿,到頭來發現最蠢的是自己!

將二維陣列當作引數的時候,必須指明所有維數大小或者省略第一維的,但是不能省略第二維或者更高維的大小,這是由編譯器原理限制的。大家在學編譯原理這麼課程的時候知道編譯器是這樣處理陣列的:

對於陣列 int p[m][n];

如果要取p[i][j]的值(i>=0 && i從以上可以看出,如果我們省略了第二維或者更高維的大小,編譯器將不知道如何正確的定址。但是我們在編寫程式的時候卻需要用到各個維數都不固定的二維陣列作為引數,這就難辦了,編譯器不能識別阿,怎麼辦呢?不要著急,編譯器雖然不能識別,但是我們完全可以不把它當作乙個二維陣列,而是把它當作乙個普通的指標,再另外加上兩個引數指明各個維數,然後我們為二維陣列手工定址,這樣就達到了將二維陣列作為函式的引數傳遞的目的,根據這個思想,我們可以把維數固定的引數變為維數隨即的引數,例如:

void func(int array[3][30]);

void func(int array[30]);

變為void func(int **array, int m, int n);

在轉變後的函式中,array[i][j]這樣的式子是不對的(不信,大家可以試一下,lz犯糊塗就被坑在這了),因為編譯器不能正確的為它定址,所以我們需要模仿編譯器的行為把array[i][j]這樣的式子手工轉變為:

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

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

func((int**)a, 3, 30);

如何將二維陣列作為函式引數

1 函式宣告 將二維陣列作為函式引數的函式宣告有兩種 二維陣列型 如 int sum int ar2 size 注意 行數可不宣告,但要求列數必須要宣告,不然將發生錯誤!指標型 如int sum int ar2 list size int row size 其中row size為行數!2 函式呼叫 ...

如何將二維陣列作為函式的引數傳遞

今天寫程式的時候要用到二維陣列作引數傳給乙個函式,我發現將二維陣列作引數進行傳遞還不是想象得那麼簡單裡,但是最後我也解決了遇到的問題,所以這篇文章主要介紹如何處理二維陣列當作引數傳遞的情況,希望大家不至於再在這上面浪費時間。正文 首先,我引用了譚浩強先生編著的 c程式設計 上面的一節原文,它簡要介紹...

如何將二維陣列作為函式的引數傳遞

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