指向数组deference的指针

时间:2015-10-17 14:38:55

标签: c

#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]

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]

是。正确的。