代码:
#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
为0,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]
。
这如何打印最后三个值?
最佳答案
int arr[2][3] = {{1,2,3},{4,5,6}};
在内存中:
1 | 2 | 3 | 4 | 5 | 6
each number on an adjacent memory "cell" the size of an int, in this order
第二行: 我 = 1 j = 0
*((*arr+(i*3))+j)) means *((*arr + 3) + 0)-> *({1, 2, 3} + 3) -> *({4, 5, 6}) = 4
请记住,x[n]
等同于 *(x + n)
,无论是 x
还是 n
。 (这也意味着 arr[1]
等同于 *(arr + 1)
、*(1 + arr)
等 1[arr]
我觉得很有趣)
这里 arr[1][0]
:x
是 arr[1]
而 n
是 0
所以第一个等价:*(arr[1] + 0)
第二个 x
是 arr
而 n
是 1
所以 *(*(arr + 1) + 0 )
.
最后arr + 1
表示arr + sizeof(*arr)
处的地址,意思是:
(arr + 1)
等同于 (*arr + 3)
因为 *arr
是 arr[0]
这是 int[3]
关于c - 打印二维数组 `*((*arr+(i*3))+j)` 时 `arr` 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30595842/