2012-04-30 69 views
2

我編寫了一個程序在運行時讀取數組元素,然後根據某些配置更改列。針對指針賦值的警告消息二維數組指針

我從GCC編譯器的cygwin以下警告消息:

pointer.c:73: error: incompatible types in assignment 

考慮下面的代碼,我怎麼能去掉這個警告?

預先感謝您的幫助

typedef struct INPUT_ST 
{ 
    float a; 
    float b; 
    float c; 
}INPUT; 
const INPUT lookup[3][3]; 
main() 
{ 
    INPUT *ptr; 
    /*typedef INPUT (st[3][3]);*/ 
    INPUT (*ptr1)[3][3]; 
    int i, j; 
    ptr = (INPUT *)&lookup; 
    (*ptr1)[3][3] = &lookup[0][0]; 

    for(i=0; i<3; i++) 
    { 
     for(j=0; j<3; j++) 
     { 
      printf("Row %d and column %d:\n", i, j); 
      printf("%f\n", (*ptr1)[i][j].a); 
      printf("%f\n", (*ptr1)[i][j].b); 
      printf("%f\n\n", (*ptr1)[i][j].c); 
     } 
     printf("\n"); 
    } 
} 
+3

我會從講述第73行的內容開始。 – MByD

+0

提供的示例代碼中的第15行。 –

回答

1

導致錯誤的線路如下:

(*ptr1)[3][3] = &lookup[0][0]; 

的原因是左手側,右手邊的任務具有不兼容的類型。

ptr1在左邊是類型INPUT (*)[3][3](指向3x3陣列INPUT的指針)。 (*ptr1)[3][3]類型爲INPUT(取消引用(未初始化)指針,然後訪問(超出邊界)元素[3][3])。 lookup的類型爲const INPUT [3][3](3x3數組const INPUT)。這使得&lookup[0][0]的類型爲const INPUT *(元素地址[0][0])。所以類型是衝突的:INPUTconst INPUT *

你真正想要做的是使ptr1指針指向數組lookup。所以,你需要添加const指針聲明,然後初始化如下:

const INPUT (*ptr1)[3][3]; 
// ... 
ptr1 = &lookup; 

你有ptr不起作用,因爲它是一個普通的指針(一維),所以你不能訪問部分解決方案ptr[i][j],這意味着取消引用INPUT這不是一個指針(但你可能訪問ptr[i*3+j]而不是ptr[i][j])。順便說一下,不要像ptr那樣丟棄const,而應該將ptr確定爲const INPUT *ptr;