【问题标题】:Which array entry is this code exactly pointing to?这段代码究竟指向哪个数组条目?
【发布时间】:2014-01-10 16:18:41
【问题描述】:

我在 C 语言中有这个编码问题,我无法完全弄清楚逻辑。我有一个 3D 数组:

a[2][3][2] = {{{a1,b1},{a2,b2},{a3,b3}},{{c1,d1},{c2,d2},{c3,d3}}};

现在如果我写 a[1][0]-a[0][0] 那么 a[1][0] 指向的内存位置第二个子集的第一个元素(我不知道这里的正确术语到底是什么),即 {c1,d1} 的起始位置(我希望这是正确的?)。类似地,a[0][0] 指向第一个子集的第一个元素的起始地址,即 {a1,b1}。

所以从这个意义上说,如果我写 a[1]-a[0] 那么它应该指向第一个子集的起始位置,即 {{a1,b1},{ a2,b2},{a3,b3}} 和第二个子集 {{c1,d1},{c2,d2},{c3,d3}} 的起始位置在我的意见应与 a[1][0]-a[0][0] 相同。

但是,当我打印这两个值时,第一个值为 6,第二个值为 3。我的逻辑到底哪里出错了?

【问题讨论】:

  • 由于这是一个 3D 数组,您提供的 none 表达式根本不会修改数组(除了初始化程序)。 a[1][0] - a[0][0] 不修改任何内容,而是执行类型化地址差异表达式。就个人而言,在解决这个问题之前,我会掌握一维和二维算术。
  • 6和3从何而来?它们是分配给变量 a1、a2、... 等的值吗?
  • @WhozCraig- 但我从未说过该操作正在修改任何内容。谢谢你的建议,我正在努力。 :)

标签: c arrays pointers pointer-arithmetic multidimensional-array


【解决方案1】:

你的想法是对的。 a[0][0] 衰减为指向数组 a 的行 0 的第一个元素的指针。 a[1][0] 衰减到数组 a 的行 1 的第一个元素。

现在,重点是两个指针给出的区别是什么

当一个指针从另一个指针中减去时,结果是指针之间的距离(以数组元素衡量)。

现在,很容易理解a[1][0] - a[0][0] 将给出a[1][0]a[0][0] 之间的距离,即6(这两个地址之间有6 元素:a1, b1, a2,b2,a3,b3)。另一方面,a[1] - a[0] 将给出这两个指针之间的距离,即3(这两个地址之间有3 元素:{a1, b1}, {a2, b2}, {a3, b3})。

注意数组a[][]6 元素,而数组a[] 只有3 元素。 a1,b1,a2,b2.... 不是a[] 的元素。

【讨论】:

    【解决方案2】:

    假设a是一个char数组,那么你会看到a[1]-a[0] = 3,a[1][0] - a[0][0] = 6。甚至虽然 a[0] 和 a[0][0] 的位置(地址)相同,a[1] 和 a[1][0] 也是一样。造成差异的原因是编译器在做数学运算,不是以字节为单位,而是以类型大小为单位。 a[0] 指向的类型的大小为 2,因此即使位置相隔 6 个字节,差异也是 3 个数组元素。同样对于 a[1][0]-a[0][0],大小为 1,它们相隔 6 个字节。数组的区别在于元素,而不是字节。

    【讨论】:

      【解决方案3】:

      有趣的问题。 :)

      我假设您知道数组元素访问和地址差异之间的区别。

      a[1]-a[0] 分 3 步跳转元素。

      a[1][0]-a[0][0] 分 6 步跳转元素。

      a[1] 在 char* [2] 中衰减。从 c1 到 a1 需要 3*2 步。

      a[1][0] 在 char* 中衰减。从c1到a1需要6个步骤。

      【讨论】:

        猜你喜欢
        • 2017-06-11
        • 2013-12-05
        • 2013-07-05
        • 2010-12-16
        • 1970-01-01
        • 2021-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多