2012-10-24 47 views
2

出於好奇,我將set_array(&array1[0])更改爲set_array[array1],該參數不是同一類型,但它的工作原理,任何想法?爲什麼要傳遞指向數組的指針到需要指向int的函數,工作沒有錯誤

#include <stdio.h> 
void set_array(int array[][9]); 
int main(void) { 
    int array1[4][9]; 
    for(int i = 0; i < 4; i++) { 
     for(int j = 0; j < 9; j++) { 
      array1[i][j] = j + 1; 
     } 
    } 
    set_array(&array1[0]); 
    for(int i = 0; i < 4; i++) { 
     for(int j = 0; j < 9; j++) { 
      printf("%d ", *(*(array1 + i) + j)); 
      //printf("%d ", array1[i][j]); 
     } 
     puts("\n"); 
    } 
    return 0; 

} 
void set_array(int array[][9]) { 
    for(int i = 0; i < 4; i++) { 
     for(int j = 0; j < 9; j++) { 
      array[i][j] = 1; 
     } 
    } 
}; 

回答

1

這裏array1具有第一行(或列)的整個數組的地址,具體取決於實現。 (&array1[0])(array1)類型相同()[n] sice數組名稱本身包含ist元素的地址。但是當您通過(&array)哪一種類型的()[m][n]和編譯器會因參數類型不匹配而引發錯誤。

我想你還沒有最後你問

+0

謝謝你,對於在我最後一個問題中錯過你的評論感到抱歉 – mko

6

在C中,數組的普通名稱與指向其第一個元素的指針相同。這被稱爲數組的衰減。進一步的解釋請參閱C faq

+2

*在這種情況下*,數組的名稱求一個指向它的第一個元素的問題看我的意見。在C中的其他語境中,兩者並不相同。 –

相關問題