2013-05-17 123 views
1

我正在嘗試解決struct的矩陣,但有些出錯。 這的代碼:多維數組指針

typedef struct { 
    bool state; 
    float val; 
    char ch[11]; 
} st_t; 

st_t matrix[3][5]; 


int main(int argc, char *argv[]) 
{ 
    int i, j; 

    // Init matrix value matrix[i][j] = i.j 
    .... 

    // Init matrix pointer 
    st_t (*pMatrix)[3][5]; 
    pMatrix = &matrix; 

    // print address element 
    fprintf(stderr, "\n\nsizeof st_t:%d\n\n", sizeof(st_t)); 
    for(i = 0; i < 3; i++) 
    { 
     for(j = 0; j < 5; j++) 
      fprintf(stderr, "matrix[%d][%d] ADDR:%p pMatrix[%d][%d] ADDR:%p\n", i, j, &(matrix[i][j]), i, j, &pMatrix[i][j]); 
     fprintf(stderr, "\n"); 
    } 
    return 0; 
} 

這是代碼的輸出:

sizeof st_t:16 

matrix[0][0] ADDR:0x8049a00    pMatrix[0][0] ADDR:0x8049a00 
matrix[0][1] ADDR:0x8049a10    pMatrix[0][1] ADDR:0x8049a50 
matrix[0][2] ADDR:0x8049a20    pMatrix[0][2] ADDR:0x8049aa0 
matrix[0][3] ADDR:0x8049a30    pMatrix[0][3] ADDR:0x8049af0 
matrix[0][4] ADDR:0x8049a40    pMatrix[0][4] ADDR:0x8049b40 

matrix[1][0] ADDR:0x8049a50    pMatrix[1][0] ADDR:0x8049af0 

例如爲什麼pMatrix [0] [1]是從矩陣的地址[0] [1]?

在此先感謝。

回答

2

你已經聲明pMatrix是一個指向3×5矩陣st_t的指針,也就是說,它指向一個由3個數組組成的3個數組,其中包括5個st_t對象。鑑於此,pMatrix[0]是由3個數組組成的5個st_t對象。但是,由於它是一個數組,它會自動轉換爲指向數組的第一個元素的指針。所以它變成了一個指向5個st_t對象數組的指針。

然後pMatrix[0][0]pMatrix[0][1]pMatrix[0][2],等等都是5個st_t對象,而不是連續st_t物體的連續陣列。

最有可能的,你想要的是:

// Declare pMatrix to be a pointer to an array of 5 st_t objects, 
// and point it to the first row of matrix. 
st_t (*pMatrix)[5] = matrix; 
+1

謝謝pMatrix [0]是一個指向5元素的數組。 pMatrix [0] [0]是數組,pMatrix [0] [0] [2]是數組的第三個元素。我們也可以爲同一個元素編寫(* pMatrix)[0] [2]。 – GMERiello

+1

+1的答案。 @GMERiello不明白你的評論是什麼意思,但答案似乎是正確的。這是你想要或沒有? –

+0

@eznme是的,答案幫助了我,我想通過指針pMatrix訪問矩陣的單個元素。現在pMatrix [0] [1]不是一個st_t元素,而是一個完整的行。 pMatrix [0] [1] [2]是第二行的第三個元素,但也包含(* pMatrix)[1] [2],換言之(明顯)pMatrix [0] ==(* pMatrix)。我希望現在更清楚。 – GMERiello