C語言只能傳遞指標,無法傳遞陣列的內容。
假設要傳遞一個二維陣列,則C會幫我們將該陣列的起始位置傳入。
參數宣告部分 有如下不同的方式:
錯誤示範
void foo1(int x[][]) { // 編譯過,但Compiler不知如何翻譯
x[2][2] = 0; // 編譯錯誤,Compiler不知如何翻譯
}
void foo4(int x[3][]) { // 編譯錯誤。
}
}
void foo4(int x[3][]) { // 編譯錯誤。
}
無論是幾維的陣列,C語言都是分配一塊連續的記憶體空間來處理。
於是其是以row major的方式來處理多維到一維的對應。
因此副程式的陣列參數宣告應該給予column大小(二維)
正確示範
void foo2(int x[][3]) { // Compiler知道如何翻譯
x[1][1] = 0; // Compiler知道要翻成*(x+1*3+1)
}
void foo3(int x[2][3]) { // Compiler知道如何翻譯
x[1][1] = 0; // Compiler知道要翻成*(x+1*3+1)
}
void foo5(int *x) { // 能傳入pointer,也能傳一個陣列起始位置*M(int M[o][x]),
x[1][1] = 0; // Compiler知道要翻成*(x+1*3+1)
}
void foo3(int x[2][3]) { // Compiler知道如何翻譯
x[1][1] = 0; // Compiler知道要翻成*(x+1*3+1)
}
void foo5(int *x) { // 能傳入pointer,也能傳一個陣列起始位置*M(int M[o][x]),
但是副程式內部的位址要自己計算,因為Compiler不知道你的column大小
*(x+1*3+1) = 0; //位址要自己計算 *(M+1*x+o)
}
*(x+1*3+1) = 0; //位址要自己計算 *(M+1*x+o)
}
全站熱搜