2016-10-10 125 views
1

這裏是我的程序:我不知道爲什麼這個計劃不會編譯

#include<stdio.h> 
#define COL 3; 

void copy_row(int arr1[][COL], int rows, int arr2[], int r); 

void copy_row(int arr1[][COL], int rows, int arr2[], int r){ 
    int i; 
    if(r >= rows || r < 0) 
    return; 

    for(i = 0; i < COL; i++){ 
    arr1[r][i] = &arr2[i]; 
    } 
} 

int main(void){ 

    return 0; 
} 

當我嘗試用gcc來編譯這一點,它說:「錯誤:之前預計‘]’‘;’令牌「在第4行和第6行。

此外,請參閱for-loop,將」arr1 [r] [i] = arr2 [i];「與「arr1 [r] [i] = & arr2 [i]」相同;「?哪個是(更正確)?

+6

您不希望在#define行的末尾添加分號。 –

+0

'#define'語句很少,如果有的話,以分號結尾。建議刪除尾隨分號,那麼唯一的編譯器消息是:warning:賦值使指針中的整數沒有對此行進行強制轉換:'arr1 [r] [i] =&arr2 [i];' – user3629249

回答

6

COL擴大到3;,所以裏面的聲明和定義是這樣的:

int arr1[][3;] 

#define行中刪除分號。

Also, refer to the for-loop, would arr1[r][i] = arr2[i]; do the same thing as arr1[r][i] = &arr2[i]; ?

不是。第一個是正確的。 左值arr1[r][i]是指整數。 右值arr2[i]也是一個整數。

如果採取&arr2[i]引用它,然後它的類型變得int*,並且是指向元素i,並嘗試將它賦值給一個左值int。如果你試圖這樣做,你的編譯器會警告你。

+0

好的。這是C語句和C預處理器指令之間區別的一個很好的例子。 –

+0

做得好。謝謝 –

相關問題