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正在输出第二个值
答案 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。