无法理解c中的2d数组中的寻址

时间:2012-08-28 04:27:26

标签: c arrays 2d

main()
{
    int a[3][2] = { {1,2},{3,4},{5,6}};
    for(int i=0;i<3;i++)
        for(int j=0;j<2;j++)
    {
        printf("%d", a[i][j]);
        printf("\t %d\n", &a[i][j]);
    }
    printf("\n%d", *(a+1));
    printf("\n%d", *a+1);
}
  

*(a + 1)的输出与* a + 1不同。

     

*(a + 1)指向第3个元素,而

     

* a + 1正在输出第二个值

4 个答案:

答案 0 :(得分:6)

  

*(a + 1)的输出与* a + 1不同。

是的,由于operator precedence*a + 1表示......

  

取消引用a(返回int)并向其添加1。返回结果(2

但是,*(a + 1)说......

  

1添加到指针 a并取消引用,即获取地址a + sizeof(int[2])的值。

“value *恰好是第二个数组的第一个元素。记住;将 n 添加到指针类型会使地址增加 n个元素。在这种情况下,每个元素都是int的数组,其中包含两个元素。

这也应该回答接下来的两个问题。在阅读了运算符优先级后,开始研究pointer arithmetic

答案 1 :(得分:4)

C实际上没有多维数组,它有数组数组。 int a[3][2]声明一个3元素数组,其元素是2维的int数组。

指针算术将此考虑在内,它会增加指针所指向的对象的大小。因此(a+1)计算a的第二个元素,它是指向数组{3, 4}的指针。通过这个指针指向你的第一个元素是3。

另一方面,

*a通过指向a的第一个元素来指向,其值为1.然后当你向它添加1时,你得到2.它实际上并没有返回第二个元素,它只是看起来像因为1 + 1 = 2.尝试将初始化更改为:

int a[3][2] = { {1,3},{5,7},{9,11}};

,你的输出将是5和2。

答案 2 :(得分:1)

您应该阅读有关运算符优先级的内容。在第二种情况*a+1中,一元运算符*比二元运算符+绑定更多。因此,操作被视为向a指向的值添加一个。

在前一种情况*(a+1)中,您正在寻找a指向的下一个元素,并取消引用它以获取其值。

HTH。

答案 3 :(得分:0)

是的,这是正确的。 因为2D数组表示一维数组的数组。在这种情况下 a[3][2] = { {1,2},{3,4},{5,6}},数组名称, a 充当数组的第0个元素。由于我们的二维数组的第零个元素是2个整数{1,2}的1-D数组。因此,(a+1)指的是2D数组{3,4}的第一个元素的地址和*(a + 1)因此,在该地址给出值即3.然而,* a提供对第一个元素的访问,而不是将其递增1给出2。