【问题标题】:How to pass multidimensional arrays of pointers in function parameter, and manipulate it?如何在函数参数中传递多维指针数组并对其进行操作?
【发布时间】:2020-12-13 13:07:39
【问题描述】:

所以我有一个这样定义的指针数组:

    sf::Sprite * game[3][3] = {{nullptr, nullptr, nullptr},
                       {nullptr, nullptr, nullptr},
                       {nullptr, nullptr, nullptr}};

在我想将它传递给函数参数之前,它一直运行良好。 我尝试了多个参数和参数,这很有效:

#include <iostream>

void printTwoDPointersArr(int * myArray[][3])
{
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            std::cout << *myArray[i][j];
}

int main()
{
    int myRealArray[3][3] = {{0, 1, 2}, {3, 4, 5}, {0, 1, 2}};
    int * myPointingArray[3][3];
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            myPointingArray[i][j] = &myRealArray[i][j];
    printTwoDPointersArr(&myPointingArray[0]);
}

但是,如果我想创建第二个数组来引用与 myPointingArray 相同的数组,我就是做不到。我不想要数组的副本,因为更改原始副本时不会更新副本:我需要参考。我试过这个:

#include <iostream>

void printTwoDPointersArr(int * myArray[][3])
{
    int * mySecondArray = &myArray[0];
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            std::cout << *mySecondArray[i][j];
}

int main()
{
    int myRealArray[3][3] = {{0, 1, 2}, {3, 4, 5}, {0, 1, 2}};
    int * myPointingArray[3][3];
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            myPointingArray[i][j] = &myRealArray[i][j];
    printTwoDPointersArr(&myPointingArray[0]);
}

但我收到以下错误:

/path/main.cpp:5: error: cannot convert ‘int* (*)[3]’ to ‘int*’ in initialization
/path/main.cpp:5:27: error: cannot convert ‘int* (*)[3]’ to ‘int*’ in initialization
    5 |     int * mySecondArray = &myArray[0];
      |                           ^~~~~~~~~~~
      |                           |
      |                           int* (*)[3]

那么,问题是:有没有一种简单的方法来操作多维指针数组并创建对它们的引用?

我是堆栈溢出的新手,如果我做错了,请告诉我。 谢谢!

【问题讨论】:

  • 我需要参考 -- 注意 -- 您对&amp; 的使用并不意味着“参考”。它是 address-of 运算符,与 C++ 引用不同。
  • 考虑使用using Array3x3 = std::array&lt;std::array&lt;int, 3&gt;, 3&gt;; 而不是原始数组。然后传递Array3x3 比原始数组更容易,初始化只是有一组额外的大括号:Array3x3 myRealArray = {{{0, 1, 2}, {3, 4, 5}, {0, 1, 2}}};
  • 我知道我应该使用 std::array... 但是可以使用基本数组吗?
  • @PaulMcKenzie 实际上 `std::array 更好一些 - 关于初始化语法。

标签: c++ arrays pointers


【解决方案1】:

您为什么不像在main()myPointingArray 中那样组装指针数组mySecondArray[3][3]

它们都将指向同一个底层对象。

#include <iostream>

void printTwoDPointersArr(int * myArray[][3])
{
    int * mySecondArray[3][3];
    // now just assemble the array of pointers as done in main()
    for (int i = 0; i < 3; i++)      
        for (int j = 0; j < 3; j++)
            mySecondArray[i][j] = myArray[i][j];
            
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            std::cout << *mySecondArray[i][j];
}

int main()
{
    int myRealArray[3][3] = {{0, 1, 2}, {3, 4, 5}, {0, 1, 2}};
    int * myPointingArray[3][3];
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            myPointingArray[i][j] = &myRealArray[i][j];
    printTwoDPointersArr(&myPointingArray[0]);
}

【讨论】:

    猜你喜欢
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 2017-10-18
    • 2022-01-20
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    相关资源
    最近更新 更多