【问题标题】:Arithmetic operation on multidimensional array多维数组的算术运算
【发布时间】:2019-05-30 03:52:48
【问题描述】:

我正在对多维数组进行一些算术运算。还尝试了一些使用 C++ 的代码。但是,我的代码输出与我对不同指针和多维数组之间关系的理论理解相矛盾。

我对 2D 和 3D 数组的理解。

二维数组

1) 同样,通过使用取消引用运算符

2)

3D 阵列

3) 同样,通过使用取消引用运算符

4)

我对图 2 和图 4 中的 B 和 C 分别指向什么感到困惑。

二维数组上的代码

#include <iostream>
using namespace std;

int main(void){



    int B[2][2] = {1, 2, 3, 4};
    cout << B << endl;
    cout << B+1 << endl;
    return 0;
}

输出:

0x7ffec3dd9f80

0x7ffec3dd9f88

这里,指向 int B 的指针增加了 ((1*4)+(1*4)) = 8 个单位,即指向 int (B+1) 的指针。 虽然我从Link 得到了一个关于二维数组中实际 B 点的解释。它指向二维数组的第一个元素。

我的代码输出和对此Link 的解释让我感到困惑。 二维数组中的 B 点实际上是什么? 而且,如果 B 指向二维数组的第一个元素的地址,那么为什么 B 的值在我们加 1 时会增加 8 个单位?为什么不增加(1*4)个单位?

3D 数组上的代码

#include <iostream>
using namespace std;

int main(void){



    int C[2][2][2] = {{
                    {1, 2},
                    {3, 4}
                  },
                  {
                    {1, 2},
                    {3, 4}
                  }};

    cout << C << endl;
    cout << C[0] << endl;
    cout << C[0] +1 << endl;
    cout << C[0][0] +1 << endl;
    return 0;
}

输出:

0x7ffeac58d130

0x7ffeac58d130

0x7ffeac58d138

0x7ffeac58d134

C 给出整个数组的起始地址。但是,它具体指向哪个部分?是指向 &C[0] 还是 &C[0][0] 还是&C[0][0][0]?

cout << C[0]+1 << endl; here, C[0] is increased by 8 unit. But, if C[0] is pointing the base address of 1st 2D array inside 3D array, then it must be increased by 16 unit to get base &C[1].

cout << C[0][0] +1 << endl; here, C[0][0] is increased by 4 unit. But if it is pointing the base address of 1st 1D array of 1st 2D array inside 3D array, then it must be increased by 8 unit to get base &C[0][1].

谢谢。

【问题讨论】:

    标签: c++ pointers multidimensional-array


    【解决方案1】:

    图 1 和图 3 正确 图 2 和图 4 不正确。 *BB[0] 被定义为完全相同的东西。与**BB[0][0] 类似。

    所以要修复图 2,实际上复制图 1,但只需将文本 B[0] 更改为 *B 等等。 B 本身指的是整个数组。图 4 同上。

    B+1定义为&amp;(B[1]),它指的是一个临时指针,指向你在图1中正确标记为B[1]的对象。

    cout &lt;&lt; B &lt;&lt; endl; 中,将B 视为B+0(即&amp;(B[0]))。当您在需要指针的上下文中使用数组时,就会发生这种情况(创建一个临时指针,它的行为与您编写 &amp;B[0] 而不是 B 的行为相同)。该语句不输出 B,它输出这个临时指针的值。

    【讨论】:

    • 然后,C[0] == *C,C[0][0] == **C 和 C[0][0][0] == ***C。我说的对吗?
    • @zipperblock C[0]*C 等具有完全相同的含义。我避免说 == 因为这是一个对其参数执行转换的运算符。例如,如果您使用结构类型而不是 int,则最后一个表达式甚至可能都不可能。
    • 如果我想从 *(B +1) 输出,它会给出二维数组中第二个一维数组地址的基地址。但是,正如您所说,B 是 &B[0],然后添加一个它将给出 &B[1],并且通过取消引用 *(&B[1]),它给出 &B[1][0]。我说的对吗?
    • @zipperblock *&amp;X 表示X。所以*&amp;B[1]B[1]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2015-06-02
    相关资源
    最近更新 更多