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+j
的p
数组中的值。
由于嵌套循环,i 和 j 的值如下所示:
i j i+j
0,0 0
0,1 1
1,0 1
1,1 2
因此,它依次打印p
(1
、2
、2
和3
(每个位置的值四次。