【问题标题】:Understanding c-pointers for rows in 2-dimensional array了解二维数组中行的 c 指针
【发布时间】:2010-04-19 21:24:01
【问题描述】:

我有以下代码:

int main() {
    int n = 3, m = 4, a[n][m], i, j, (* p)[m] = a;
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
            a[i][j] = 1;
    p++;
    (*p)[2] = 9;
    return 0;
}

我很难理解这里的 p 是什么,以及最终对 p 的操作的后果。有人可以简要解释一下发生了什么。我知道 c 指针的简单设置,但这里稍微复杂一些。

【问题讨论】:

  • 嗯,这是一个使用 Java(和一些基本的 C)进行介绍性编程的小组工作的练习。我其实是这门课的助教,但是我的 C 比我的 Java 生疏多了,所以我只是在做这门课的最后准备。

标签: c arrays pointers multidimensional-array


【解决方案1】:

aint[m] 的数组,p 是指向int[m] 的指针。它被初始化为a,它衰减为指向其第一个元素的指针。

取消引用p 产生int[m],它衰减为int*(指向其第一个元素的指针)。所以(*p)[2]2 添加到int*,这是衰减的结果。所以它将第一个4 整数中的第三个(int[m]m 为 4)设置为9

添加到p 会将存储在其中的地址推进sizeof(int[m]) 字节单位,在运行时(因为m 不是编译时间常数)计算为4 * sizeof(int)。所以(*(p+1))[2] 将访问第二个4 整数的第三个。总的来说,p3 这样的 4 整数数组指向:a+0a+1a+2

请注意,您创建了一个 C99 VLA 可变长度数组。您需要将 #define nm 转换为整数常量以摆脱那些 VLA(在 C 编译器中不太可移植)。

【讨论】:

    【解决方案2】:

    p 是一个指向 4 元素 int 数组的指针(即指向 int 的指针的指针,其中第一个维度为 4,第二个维度未知)。当您增加 p 时,它指向下一个 4 元素 int 数组,即总共第五个 int。然后p被取消引用,偏移量为2,这意味着第七个int发生变化,所以你得到

      1 1 1 1
      1 1 9 1
      1 1 1 1
    

    作为 4x3 数组的最终状态。

    【讨论】:

      【解决方案3】:

      一些小字声明应该清楚这段代码的作用:

      #include <stdio.h>
      
      int main() {
          int n = 3, m = 4, a[n][m], i, j, (* p)[m] = a;
          for (i = 0; i < n; i++)
              for (j = 0; j < m; j++)
                  a[i][j] = 1;
      
          printf("p points to %u, sizeof(int)*m = %d", p, sizeof(int)*m);
          p++;
          printf(", p++ points to %u\n", p);
      
          (*p)[2] = 9;
      
          for (i = 0; i < n; i++)
              for (j = 0; j < m; j++)
                  printf("a[%d][%d] = %d\n", i, j, a[i][j]);
      
          return 0;
      }
      

      示例输出:

      p points to 2293536, sizeof(int)*m = 16, p++ points to 2293552
      a[0][0] = 1
      a[0][1] = 1
      a[0][2] = 1
      a[0][3] = 1
      a[1][0] = 1
      a[1][1] = 1
      a[1][2] = 9
      a[1][3] = 1
      a[2][0] = 1
      a[2][1] = 1
      a[2][2] = 1
      a[2][3] = 1
      

      很明显,p 是指向int[m] 的指针,因此p++ 会将指针前进到a 中的下一行。这就是为什么(*p)[2] 会改变a[1][2]。如果你没有增加p,那行会改变a[0][2]

      希望这足够简单!?

      【讨论】:

        猜你喜欢
        • 2017-04-26
        • 1970-01-01
        • 2017-06-11
        • 1970-01-01
        • 2013-01-26
        • 2016-05-08
        • 2021-08-23
        • 1970-01-01
        相关资源
        最近更新 更多