2011-10-02 41 views
1
a[2][3] = {{-3,14,5},{1,-10,8}} 

*(a[j]+k) 
*(a[j+k-2]) 
(*(a+j))[k]) 

(*(a+k-1))[j] 
*((*(a+j))+k)) 

(**(a+j)+k) 
*(&a[0][0]+j+k) 

當我printf的這些我得到 輸出: -10 分別 請如果任何人能詳細解釋值是如何來的,我是一個新的起始人,請原諒我格式不好,因爲這麼多的工作也打擾你:)2三維Minkowski空間陣列解除引用,如何通過指針評估

+0

我不明白你發佈了什麼。你能解釋你在問什麼嗎? – Gabe

+0

我試圖更好地格式化您的代碼。我希望我保留了預期的意思。請讓我知道,如果我更換'____'是不正確的,或恢復編輯。 – Paulpro

+0

這是一個詭計問題嗎? –

回答

0

我假設j == 1和k == 2:

*(a[j]+k) == *(a[1]+2) : 

    a[1] = {1, -10, 8}; 
    So a[1]+2 is a pointer to 8, and *(a[1]+2) == 8 

 

*(a[j+k-2]) == *(a[1+2-2]) == *(a[1]): 

    a[1] = {1, -10, 8} 
    Since *a[1] is the value of the first element in a[1], the expression evaluates to 1 

 

(*(a+j))[k] == (*(a+1))[2]: 

    a+1 is a pointer to the second element in a, so *(a+1) == a[1] = {1, -10, 8} 
    a[1][2] == 8 

 

(*(a+k-1))[j] == (*(a+2-1))[1] == (*(a+1))[1]: 

    *(a+1) == a[1] (see the last answer) 
    a[1][1] == -10 

 

*((*(a+j))+k) == *((*(a+1))+2): 

    *(a+1) == a[1], so the expressions is equivalent to *(a[1]+2) 
    *(a[1]+2) is equivalent to a[1][2] for the same reasoning as above, which is 8 

 

(**(a+j)+k) == (**(a+1)+2): 

    *(a+1) = a[1] 
    **(a+1) = a[1][0] == 1 
    Adding 2 to that gives 3 

 

*(&a[0][0]+j+k) == *(&a[0][0]+1+2) == *(&a[0][0]+3): 

    &a[0][0] == a[0] 
    *(a[0]+3) == a[0][3]; 

這最後一個是返回1,因爲它是在存儲器延伸過去的端部的[0]到[1],和你'得到[1] [0]。我認爲這種行爲實際上是未定義的。它取決於C標準是否保證初始化的二維數組將在內存中順序分配,並可能導致分段錯誤或更糟。

+0

有沒有更好的答案奇妙地解釋比你好,保持良好的工作:)) –

+0

我完全可以看到你是一個專業的,但考慮到這一點,從你告訴我 int a [b] [c ]。一個[d]的 值並[e],使得d

+0

^^^對不起,在評論中回覆我的聲望很低不能回答我自己的問題 –