【问题标题】:Pointer to an element of a 2D Array in C++指向 C++ 中二维数组元素的指针
【发布时间】:2022-01-02 14:55:27
【问题描述】:

我又被指针原理弄糊涂了。

我有以下两个数组a和b:

int16_t a[3][2] = {

  {30,  40},
  {31,  41},
  {32,  42}
};

int16_t b[3][2] = {

  {50,  40},
  {51,  41},
  {52,  42}
};

b 的第二列应始终等价于 a 的第二列。因此,每当第二列的 a 发生变化(例如 40 变为 60)时,这也应该在 b 中表示。

所以我正在寻找类似使用指针但无法使其工作的东西:

int16_t a[3][2] = {

  {30,  40},
  {31,  41},
  {32,  42}
};

int16_t b[3][2] = {

  {50,  (*a[0][1])},
  {51,  (*a[1][1])},
  {52,  (*a[2][1])}
};

我对指针原理不太熟悉。有什么建议吗?

【问题讨论】:

  • b 的元素仍然是 16 位整数。你不能做任何类型的指针魔术来让他们总是关注a。反正不是这样的。让它们保持同步有什么问题吗?这确实是最简单的事情。

标签: c++ arrays pointers


【解决方案1】:

您立即间接通过指针,并将指向整数的副本存储在数组中。对原件的更改对副本没有影响。由于b 数组是一个整数数组,它的元素不能指向或引用任何东西;它们不是指针也不是引用。

如果您希望一个值反映另一个值,则需要间接。在这种情况下,指针将是选择,因为引用不能是数组元素。这是一个示例,其中b 是一个指向整数的(数组)指针数组

std::int16_t b0[] = {
  50,
  51,
  52,
};


std::int16_t* b[][2] = {
  {b0 + 0,  a[0] + 1},
  {b0 + 1,  a[1] + 1},
  {b0 + 2,  a[2] + 1},
};

您也可以定义一个特殊的类似“变体”的类来存储整数,或者透明地引用整数。但这将是很多样板文件,我不相信这值得付出努力。

【讨论】:

    【解决方案2】:

    b 的元素应该是指针,如果你想实现这一点。在这种情况下,您可以将b 的第二列的元素设置为指向它们在数组a 中的对应元素。

    所以你的代码可以这样写:

    int *b[3][2] = {
             {new int(50), (&a[0][1])},
             {new int(51), (&a[1][1])},
             {new int(52), (&a[2][1])}
    };
    

    请注意,如果您不记得 delete 使用 new 创建的元素,这可能会导致内存泄漏。这可以通过使用另一个数组来初始化b 的第一列来避免。

    使用此解决方案,您必须使用* 运算符来查看b 元素的值。例如:

    std::cout << *b[0][0] << std::endl;
    

    一个更简单的解决方案是实现一个函数来同时更新两个数组。这可以简化处理和使用b 元素的过程,但它的性能有点差,因为更新过程可能需要双倍的时间作为第一个解决方案。

    【讨论】:

    • 为了避免泄漏或一般动态内存的东西,只需定义另一个数组:int16_t bvals[3]; 并指向它。当然,现在它是一个指针数组,这可能会导致其他问题。我们真的没有来自 OP 的关于他们试图解决的实际问题的信息。对我来说听起来像XY problem
    猜你喜欢
    • 2017-06-11
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2016-05-08
    • 1970-01-01
    相关资源
    最近更新 更多