2014-09-22 60 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)每个位置的值的四个倍。