c - 打印二维数组 `*((*arr+(i*3))+j)` 时 `arr` 如何工作?

标签 c arrays pointers multidimensional-array

代码:

#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] :xarr[1]n0 所以第一个等价:*(arr[1] + 0)
第二个 xarrn1 所以 *(*(arr + 1) + 0 ).
最后arr + 1表示arr + sizeof(*arr)处的地址,意思是: (arr + 1) 等同于 (*arr + 3) 因为 *arrarr[0]这是 int[3]

类型

关于c - 打印二维数组 `*((*arr+(i*3))+j)` 时 `arr` 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30595842/

相关文章:

c - 如何将参数传递给我的应用程序,其中包括 gdb 上的 - 符号?

C++ 创建和初始化数组的最佳方式

c - 我的算法的奇怪行为

javascript - 在对象数组中搜索条目匹配变量,并检查它是否与其他字段匹配

c - 计算一个值在数组中出现次数的最佳方法是什么?

pointers - 如何创建可以以线程安全方式传递给 FFI 函数的未初始化指针?

c - 知识树中的段错误

c++ - WM_NEXTDLGCTL 可以与非对话框窗口一起使用吗?

android - 为什么 texImage2D 总是给出无效操作错误?

javascript - 通过搜索模式从具有多个键的数组中查找和删除