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
有人可以解释一下这段代码是如何工作的吗?
最佳答案
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]
相同,因为指针逻辑(如上所示)围绕 +
是可交换的。
请参阅this question了解更多详情。
所以实际上只有两个语句:
*(p[i]+j)
*(p[j]+i)
当然,这只是p
+ 偏移[x]
+ 偏移
。所以实际上,这只是一个声明:
*p[i+j]
这当然是存储在 p
数组中偏移量 i+j
处的值。
由于嵌套循环,i和j的值如下:
i j i+j
0,0 0
0,1 1
1,0 1
1,1 2
所以它依次打印p
每个位置的值(1
,2
,2
和3
)四次。
关于c - 指针程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25974478/