c++ - 多维数组的算术运算

标签 c++ pointers multidimensional-array

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

我对二维和三维数组的理解。

二维数组

1) enter image description here 同样,通过使用取消引用运算符

2) enter image description here

3D 阵列

3) enter image description here 同样,通过使用取消引用运算符

4) enter image description here

我对图 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指向二维数组的第一个元素的地址,那么为什么当我们对它加1时B的值增加了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].

谢谢。

最佳答案

图 1 和图 3 正确,图 2 和 4 不正确。 *BB[0]被定义为完全相同的意思。与 **B 类似和 B[0][0] .

因此,要修复图 2,实际上复制图 1,但仅更改文本 B[0]*B等等。 B本身指的是整个数组。图 4 同上。

B+1定义为意义 &(B[1]) ,它指的是指向您已正确标记为 B[1] 的对象的临时指针在图 1 中。

cout << B << endl; , 治疗 B如说B+0 (即 &(B[0]) )。当您在需要指针的上下文中使用数组时,就会发生这种情况(创建一个临时指针,它的行为就像您编写了 &B[0] 而不是 B 一样)。该语句不输出B,它输出这个临时指针的值。

关于c++ - 多维数组的算术运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56371388/

相关文章:

C++ 运算符重载总是 false

c++ - 当 A=LLt 时求解 Lx=b 和 Px=b

c++ - 来自随机数生成器包装器 (C++) 的令人困惑的内联行为

Java - 对数组进行两次排序?

swift - 如何在 Swift 中保留复杂的数据结构,关于前进方向的建议

C++:通过指针调用成员函数

c - 初始化指针数组

c - 为什么取消引用指针并打印值会使程序崩溃

c - C 编程中指针错误的因式分析

C++多线程指针指向指针