3
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) 指向第三个元素,而

*a+1 输出第二个值

4

4 回答 4

6

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

是的,由于运算符优先级*a + 1方法...

取消引用a(返回一个int)并添加1到它。返回结果 ( 2)

然而,*(a + 1)说...

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

"value* 恰好是第二个数组的第一个元素。请记住;将n添加到指针类型会使地址前移n 个元素int。在这种情况下,每个元素都是一个具有自己的两个元素的数组。

这也应该回答接下来的两个问题。读完运算符优先级后,开始学习指针算法

于 2012-08-28T04:35:50.067 回答
4

C 并没有真正的多维数组,它有数组的数组。int a[3][2]声明一个 3 元素数组,其元素是 2 维整数数组。

指针算术考虑了这一点,它增加了指针指向的对象的大小。所以(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。

于 2012-08-28T04:43:08.380 回答
1

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

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

HTH。

于 2012-08-28T04:34:51.907 回答
0

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

于 2012-08-28T18:03:37.290 回答