【发布时间】:2015-08-16 05:33:22
【问题描述】:
代码:
#include <stdio.h>
int main(void)
{
int arr[2][3] = {{1,2,3},{4,5,6}};
int i, j;
for(i = 0; i < 2; i++)
{
for(j = 0; j < 3; j++)
{
printf("%d ", *((*arr+(i*3))+j));
}
printf("\n");
}
return 0;
}
我很惊讶上面的代码如何给出输出:
1 2 3
4 5 6
我知道*(arr+i) == arr[i] 并且我应该使用arr[i][j] 而不是让一切变得更复杂,但我不明白*((*arr+(i*3))+j) 是如何工作的。
据我了解,*((*arr+(i*3))+j) 可以简化为 *((*arr)+(i*3)+j),因为 *(间接运算符)在这里具有最高优先级。
因此,当i 为零并且j 迭代从0 到2 时,表达式与打印第一个子数组的整数的arr[0][j] 相同。
当i 变为 1 时,我的困惑就增加了。接下来的三个表达式将是 *((*arr)+(1*3)+0)、*((*arr)+(1*3)+1) 和 *((*arr)+(1*3)+2),可以简化为 arr[0][3]、arr[0][4] 和 arr[0][5]。
这如何打印最后三个值?
【问题讨论】:
-
数组值是连续存储的。
-
这是否意味着
arr[0][3] == arr[1][0]、arr[0][4] == arr[1][1]和arr[0][5] == arr[1][2]?
标签: c arrays pointers multidimensional-array