2014-09-22 87 views
-5
int main() 
{ 
    static int a[2][2] = {1, 2, 3, 4}; 
    int i, j; 
    static int *p[] = {(int*)a, (int*)a+1, (int*)a+2}; 
    for(i=0; i<2; i++) 
    { 
     for(j=0; j<2; j++) 
     { 
      printf("%d, %d, %d, %d\n", *(*(p+i)+j), *(*(j+p)+i), 
      *(*(i+p)+j), *(*(p+j)+i)); 
     } 
    } 
    return 0; 
} 

當我運行這段代碼的輸出是:指針程序

1, 1, 1, 1 
2, 2, 2, 2 
2, 2, 2, 2 
3, 3, 3, 3 

能有人請解釋這個代碼是如何工作的?

+2

編譯所有警告和調試信息('gcc -Wall -g')。然後**使用調試器**('gdb')逐步運行程序,在調試器中顯示相關變量。 – 2014-09-22 12:45:52

+0

你確定要像你一樣初始化'p'嗎?也許'(int *)a + 1'應該是'a [1]'? – 2014-09-22 12:47:35

+0

op請求解釋請不要忽略 – Tushar 2014-09-22 12:49:35

回答

1

在printf的四個指針操作:

*(*(p+i)+j) 
*(*(j+p)+i) 
*(*(i+p)+j) 
*(*(p+j)+i) 

評估以下內容:

*(*(p+i)+j) -> *(p[i]+j) 
*(*(j+p)+i) -> *(p[j]+i) 
*(*(i+p)+j) -> *(i[p]+j) 
*(*(p+j)+i) -> *(j[p]+i) 

p[n]相同n[p]作爲指針邏輯(如上所見)是commutitive周圍+
查看this question瞭解更多詳情。

所以實際上只有兩種說法:

*(p[i]+j) 
*(p[j]+i) 

當然,這只是p +偏移[x] + offset。因此,其實,它只有一個說法:

*p[i+j] 

這是當然的,存儲在p數組中的偏移值i+j

由於嵌套循環,是i和j的值如下:

i j i+j 
0,0 0 
0,1 1 
1,0 1 
1,1 2 

所以它打印反過來,在p1223)每個位置的值的四個倍。