按本https://stackoverflow.com/a/3912959/1814023我們可以宣佈它接受二維數組作爲二維數組和功能
void func(int array[ROWS][COLS]).
而且按照這樣的功能,http://c-faq.com/aryptr/pass2dary.html他們說:「由於調用的函數並不爲數組分配空間,它不需要知道整體大小,因此可以省略行數NROWS,數組的寬度仍然很重要,所以列維數NCOLUMNS(對於三維或更多維數組, )必須保留「
我試過這個,它的工作原理......請注意,我改變了列的大小。
#include <stdio.h>
#define ROWS 4
#define COLS 5
void func1(int myArray[][25])
{
int i, j;
for (i=0; i<ROWS; i++)
{
for (j=0; j<COLS; j++)
{
myArray[i][j] = i*j;
printf("%d\t",myArray[i][j]);
}
printf("\n");
}
}
int main(void)
{
int x[ROWS][COLS] = {0};
func1(x);
getch();
return 0;
}
我的問題是,爲什麼在CFAQ鏈接(http://c-faq.com/aryptr/pass2dary.html)他們說: 「The width of the array is still important
」?即使我提供了錯誤的列大小。 有人可以解釋一下嗎?
這不應該編譯,真的。你正在試圖將一個int(*)[5]'(當然是衰減後)作爲int(*)[25]'傳遞。 – chris
實際上很簡單。要索引第一行(第0行)中的元素,您只需要知道列號。 'index = col'。當行爲0時,寬度不重要。然而,要訪問任何其他行上的元素,還必須知道列的寬度,因爲公式會變成'index = row * numCols + col' - 所以,你所做的事情應該會崩潰。如果沒有,每次執行它都只是運氣。將COLS設置爲25意味着當i = ROWS-1和j = COLS-1時,意味着對於最後一個元素,索引計算爲索引=(4-1)* 25 +(5-1) ! Baaaad! – enhzflep
@chris:它'編譯',因爲代碼調用'func()',但定義'func1()'。所以被調用的函數不是定義的函數(又名'在問題中存在拼寫錯誤')。如果您使用C99或更高版本的編譯器,則應該仍然會收到警告(至少)用於調用未聲明的函數。由於代碼使用'getch()',它可能在Windows上運行,因此使用的是古董C89編譯器(又名MSVC)。 –