【问题标题】:How to access elements of 2D array by pointer to an array如何通过指向数组的指针访问二维数组的元素
【发布时间】:2021-10-08 07:35:25
【问题描述】:

我们知道int array[5]; &array 是int (*)[5] 我们可以分配和使用它们作为

int array[5] = {1,2,3,4,5};
int (*p)[5] = &array;
// to access first element
printf("%d", p[0][0]);

以上代码用于一维数组。

如何使用这种指向数组的方法来访问 2D 或 n-D 数组? int array[n][n] 对应的 &array 是什么?

【问题讨论】:

标签: c++ arrays c pointers


【解决方案1】:

一般情况下,如果p是指针名,i行号j列号,

  1. (*(p+i)+j) 将给出二维数组中元素的内存地址。我是行号。 j是列号,
  2. *(*(p+i)+j) 将给出该元素的值。
  3. *(p+i) 将访问第 i 行 要访问列,请将列号添加到 *(p+i)。您可能必须将指针声明为 (*p)[columns] 而不仅仅是 *p。这样做,您将声明指向 2D 数组的指针。

使用指针算法将二维数组视为一维数组。将指针 *Ptr 初始化为第一个元素 (int *Ptr = *data),然后添加一个 no。 (Ptr + n) 访问列。添加一个大于列号的数字只会继续计算下一行第一列的元素(如果存在)。 Source

【讨论】:

    【解决方案2】:

    & 运算符只返回一个指向整个数组的指针,因此例如,您可以将其分配为 1 级高维数组的第一部分。 为了理解这一点,我们可以通过这段代码 sn-p 来显示差异:

    int array[5] = {1, 2, 3, 4, 5};
    printf("array address: %p\n&array address: %p\n", array, &array);
    /* now test incrementing */
    printf("array+1 address: %p\n&array+1 address: %p\n", array+1, &array+1);
    

    上述代码的示例输出为:

    array address: 0x7fff4a53c310
    &array address: 0x7fff4a53c310
    array+1 address: 0x7fff4a53c314
    &array+1 address: 0x7fff4a53c324
    

    如您所见,如果我们增加 array 指针,它会将地址增加四(因为整数在我的编译器中占用 4 个字节)。如果我们增加 &array 指针,它会增加 20,即 0x14。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-26
      • 2021-10-30
      • 1970-01-01
      • 2022-01-02
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多