【问题标题】:Pointer to array deference指向数组引用的指针
【发布时间】:2015-10-17 14:38:54
【问题描述】:
#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]

【问题讨论】:

    标签: c


    【解决方案1】:

    int (*ptr)[3] 定义了一个指向 3 个元素的数组的指针。

    因此访问(*ptr)[1] 指的是ptr 现在指向的数组的第二个元素(例如,它指向包含2 的位置)。把它想象成一个矩阵。 Ptr 指向行(例如,它将指向包含 4 的位置)。

    现在关于ptr++。编译器知道 ptr 指向一个由 3 个 int 元素组成的数组。所以步骤ptr++ 将指针增加3 * sizeof(int)。在我们的矩阵类比中,ptr 现在指向下一行。

    是的,您对“这是否意味着 (*ptr)[1] 等于 ptr[0][1] 而 (*ptr)[2] 意味着 ptr[0][2]?”的观点是正确的

    【讨论】:

      【解决方案2】:

      首先,你需要记住这一点

      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] first 取消引用 ptr 导致第一个子数组。然后,[2] 从第一个子数组中获取第三个元素,即 3。

      接下来,

      ++ptr;
      

      增量ptr 这意味着现在,它指向第二个子数组的地址。所以现在,(*ptr)[1] 第一次取消引用 ptr 导致第二个子数组。然后,[1] 从第二个子数组中获取第二个元素,即 4。类似地,(*ptr)[2] 第一个取消引用 ptr 导致第二个子数组。然后,[2] 从第二个子数组中获取第三个元素,即 5。

      现在,

      ptr++;
      

      进一步增加ptr,这意味着它现在指向第二个子数组或二维数组的内存地址过去。在此之后,在 (*ptr)[1](*ptr)[2] 中取消引用指针会调用 Undefined Behavior,因为您正在读取经过数组的无效内存地址。

      最后,

      这是否意味着(*ptr)[1] 等于ptr[0][1](*ptr)[2] 意味着ptr[0][2]

      是的。正确。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 2016-07-30
      相关资源
      最近更新 更多