【问题标题】:Pointer arithmetic with multidimensional Array Notation多维数组表示法的指针算法
【发布时间】:2014-12-05 13:38:48
【问题描述】:

这是我的第一个问题:)

double MyArray[][6];
double* Myptr = MyArray[0];

所以我一直在想,为什么在指针算术中,我可以像这样标记一个指针以在单个维度上移动,

*(Myptr + i);

但如果我尝试使用 for 循环遍历数组的维度,它不会让我

*(*(Myptr + i) + j); 

但它确实让我可以将这个符号与数组本身一起使用。

*(*(MyArray + i) + j);

我想知道为什么这是一个限制?或者我写错了。

【问题讨论】:

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


    【解决方案1】:

    Myptr 是一个指向 double 的指针,所以 *(Myptr + i) 是一个 double,虽然您可以在其中添加 j,但您不能取消引用结果。

    你是否像这样声明Myptr

    double (*Myptr)[6] = MyArray;
    

    那么Myptr 将是一个指向6 个doubles 数组的指针。因此,*(Myptr + i) 将是 double[6],并且表达式将起作用。

    不幸的是,您可以使用这种语法对数组进行索引,这让第一次看到它并且从未学习过指针衰减的人感到惊讶。 C 和 C++ 中数组的一个有趣之处在于,它们几乎在所有情况下都衰减为指针。这意味着几乎总是在使用数组时(存在例外),数组会隐式转换为指向其第一个元素的指针,其余部分通过指针运算完成。

    例如,当您编写MyArray[i] 时就是这种情况。标准将MyArray[i] 定义为*(MyArray + i)(标准使用了更多的括号,但归根结底就是这样),当您了解MyArray 衰减为指针时,这是有道理的,i 被添加到此指针,并且结果指针被取消引用。它还解释了为什么 i[MyArray] 也同样有效(如果风格不好)。

    在多维数组的上下文中,理解多维数组仅仅是数组的数组很重要。在您的情况下,MyArray 是一个双精度数组。 MyArray[0] 是一个双精度数组。在指针衰减中,MyArray 衰减为指向双精度数组的指针,当您取消引用该指针并使用它指向的数组时,that 数组也衰减为指针(双精度)当你使用它时。它一直在腐烂。

    【讨论】:

      【解决方案2】:

      MyArray 的类型为 double[][6],而 MyPointer 的类型为 double*

      现在数组和指针是不同的,但这在这种情况下并不重要。这两个变量的类型都有数组/指针的东西,但 My Array 有两个(计数:[][6])而 MyPointer 只有一个(计数:*)。这就是为什么您可以将取消引用(即 * 运算符)应用到 MyArray 两次,并且只应用到 MyPointer 一次。

      现在,如果您想要一个可以以与使用 MyArray 相同的方式使用的指针,这是可能的,但它的类型不会是 double**(因为数组和指针 不同的)。你这样写:

      double (*MyPointer2)[6] = MyArray;
      

      这个类型有两个数组/指针,所以你可以对它应用两次解引用。

      【讨论】:

        【解决方案3】:

        在这种情况下,MyPtr 只是一维的,因为它被分配给 MyArray 中的特定“数组”。

        【讨论】:

        • 哦.. 我明白了,所以指针实际上将能够穿过二维数组,但就像一维一样。这意味着 *(Myptr + i);我能覆盖整个多阵列吗?
        • 没关系,我没有考虑到 MyPtr 是一个双指针。查看其他答案。但您的评论很可能是肯定的。
        【解决方案4】:

        因为Myptrdouble*。指向双精度的指针。它不知道数组的维度。

        【讨论】:

        • 你能提个建议吗,我怎样才能让我的指针了解维度?
        猜你喜欢
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        • 2011-01-12
        • 2021-05-10
        • 2017-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多