C語言只能傳遞指標,無法傳遞陣列的內容。
假設要傳遞一個二維陣列,則C會幫我們將該陣列的起始位置傳入。
參數宣告部分  有如下不同的方式:
錯誤示範
 void foo1(int x[][]) {  // 編譯過,但Compiler不知如何翻譯
      x[2][2] = 0;  // 編譯錯誤,Compiler不知如何翻譯
 }
 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]),
           但是副程式內部的位址要自己計算,因為Compiler不知道你的column大小
      *(x+1*3+1) = 0;  //位址要自己計算   *(M+1*x+o)
 }
arrow
arrow
    全站熱搜

    Y CP 發表在 痞客邦 留言(0) 人氣()