#include <stdio.h>
int main()
{
int a[][3] = {1, 2, 3, 4, 5, 6};
int (*ptr)[3] = a;
printf("%d %d \n ", (*ptr)[1], (*ptr)[2]);
++ptr;
printf("%d %d\n", (*ptr)[1], (*ptr)[2]);
ptr++;
printf("%d %d\n", (*ptr)[1], (*ptr)[2]);
return 0;
}
任何人都可以解释为什么在第一个printf,(* ptr)[1],(* ptr)[2]给2,3作为输出?
不是(*ptr)[1]
输出应该是4而(*ptr)[2]
输出应该是0?
是否意味着(*ptr)[1]
等于ptr[0][1]
和
(*ptr)[2]
表示ptr[0][2]
?
答案 0 :(得分:1)
int (*ptr)[3]
定义了一个指向3个元素数组的指针。
因此,访问(*ptr)[1]
指的是ptr现在指向的数组的第二个元素(例如,它指向位于contitaining 2的位置)。把它想象成一个矩阵。 Ptr指向该行(例如,它将指向包含4的位置)。
现在关于ptr++
。编译器知道ptr指向一个包含3个int元素的数组。因此,步骤ptr++
将指针递增3 * sizeof(int)
。在我们的矩阵类比中,ptr现在指向下一行。
是的,你的观点是“是否意味着(* ptr)[1]等于ptr [0] [1]和(* ptr)[2]意味着ptr [0] [2]?”是正确的< / p>
答案 1 :(得分:0)
首先,你需要记住
int a[][3] = {1, 2, 3, 4, 5, 6};
与
相同int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
和
int (*ptr)[3] = a;
与
相同int (*ptr)[3] = &a[0];
现在,(*ptr)[1]
首先取消引用ptr
导致第一个子阵列。然后,[1]
从第一个子阵列获取第二个元素,即2. (*ptr)[2]
首先解除引用第一个子阵列的ptr
。然后,[2]
从第一个子阵列中获取第三个元素,即3。
接下来,
++ptr;
增量ptr
这意味着现在,它指向第二个子阵列的地址。所以现在,(*ptr)[1]
首先解除ptr
导致第二个子阵列。然后,[1]
从第二个子阵列获得第二个元素,即4. {同样,(*ptr)[2]
首先取消引用ptr
,导致第二个子阵列。然后,[2]
从第二个子数组中获取第三个元素,即5。
现在,
ptr++;
进一步增加ptr
,这意味着它现在指向内存地址过去第二个子阵列或2D数组。在此之后,当您在读取数组之外的无效内存地址时,将(*ptr)[1]
和(*ptr)[2]
中的指针解除引用未定义行为。
最后,
是表示
(*ptr)[1]
等于ptr[0][1]
而(*ptr)[2]
表示ptr[0][2]
?
是。正确的。