2017-06-22 133 views
1
typedef struct piece Piece; 
struct piece{ 
char color; 
char symbol; 
}; 
int readPiece(Piece * p[]); 

//因爲我的代碼很長。我沒有把他們全部放在這裏。如何使用指針傳遞二維數組結構

int main(void){ 
    int row = 0; 
    int col = 0; 

    Piece input[LEN][LEN]; 
    readPiece(input); 
    return 0; 
} 

//讀入16 * 2個特定字符。

int readPiece(Piece * p[]){ 
    int row = 0; 
    int col = 0; 


    while(row < LEN){ 
     col = 0; 
     while(col < LEN){ 
      scanf("%c%c",&(p[row][col] .color), &(p[row][col].symbol)); 
      if((p[row][col].color == 'R' || p[row][col].color == 'G' || p[row][col].color == 'B' || p[row][col].color == 'Y') && (p[row][col] . symbol == '*' || p[row][col].symbol == '^' || p[row][col].symbol == '#' || p[row][col].symbol == '$')){ 
      getchar(); 

      }else{ 
      return 0; 
      } 
      col ++;  
     } 
     row ++; 
    } 
    return 1; 

} 

//我剛剛開始學習C語言。我試圖通過指針傳遞一個2d結構體到函數中,但是當我編譯它時,它顯示'不兼容的指針類型傳遞'。 所以我想問什麼是正確的方式來傳遞一個2D結構到一個函數,以及爲什麼我的工作。謝謝。

+2

您提供的內容與MCVE([MCVE])非常接近。看起來好像你需要定義'LEN'並且包含'',但是這就是全部。提供更多不會很好。這樣做很好。你爲什麼不用'int readPiece(Piece p [LEN] [LEN]);'?這似乎是傳遞結構類型的二維數組的一種合理的方式。 (你不要在縮小的main()中使用'row'或'col'。) –

+0

是的,我知道int readPiece(Piece p [LEN] [LEN])會工作,但我正在學習指針。我只是想練習,我不明白爲什麼這種方法不起作用。還是應該使用** p來代替?Thx –

+0

就像在函數中傳遞2d數組一樣。 https://stackoverflow.com/questions/16724368/how-to-pass-a-2d-array-by-pointer-in-c –

回答

2

我最近也遇到過這個問題。在函數定義頭(和函數聲明)中使用Piece (*p)[LEN]而不是Piece *p[]

*p[]將是一個指針數組,而(*p)[]將指向數組。

嘗試閱讀這個問題,以及:
C pointer to array/array of pointers disambiguation

+1

也許「在聲明和定義中的函數原型中」會是精確的,如果有點羅嗦。 –

+0

使用數組指針作爲參數很好,但語法有點混亂。最好使用「Piece p [LEN] [LEN]」,它相當於可讀性。 – Lundin

0

Piece * p[]意味着指針數組所以它是錯誤的類型。

該函數應聲明爲int readPiece(Piece p[LEN][LEN);
或者如果你願意,int readPiece(size_t length, Piece p[length][length]);