C语言 指针程序


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, %dn", *(*(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

有人可以解释一下这段代码是如何工作的吗?

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] 相同,因为指针逻辑(如上所示(在 + 周围是可交换的。
有关更多详细信息,请参阅此问题。

所以实际上只有两种说法:

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

当然,这只是p+偏移[x]+offset。 所以实际上,它只有一个陈述:

*p[i+j]

当然,这是存储在偏移量i+jp数组中的值。

由于嵌套循环,i 和 j 的值如下所示:

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

因此,它依次打印p(1223(每个位置的值四次。

最新更新