C++ 返回和插入二维数组对象

标签 c++ arrays syntax 2d

我正在尝试从一个较小的二维数组对象返回一个数组数据成员,并尝试将该数组插入到一个较大的二维数组对象中。但是在尝试这样做时,我遇到了两个问题。

第一个问题是我想返回二维数组的名字,但是我不知道如何正确的语法来返回二维数组的名字。

这是我的二维数组数据成员的样子

private:
int pieceArray[4][4];
// 2D Smaller Array

我想将这个数组返回到一个函数中,但是这个会导致编译器错误:

int Piece::returnPiece()
{
    return pieceArray; //not vaild
    // return the 2D array name
}

我厌倦了使用这种返回类型并且它起作用了:

int Piece::returnPiece()
{
    return pieceArray[4][4];
}

但我不确定这是否是我想要的,因为我想返回数组及其所有内容。

另一个问题是 InsertArray() 函数,我会将 returnPiece() 函数放在 InsertArray() 的参数中。

InsertArray() 的问题在于参数,这是它的代码:

void Grid::InsertArray( int arr[4][4] ) //Compiler accepts, but does not work
{
    for(int i = 0; i < x_ROWS ; ++i)
    {
         for (int j = 0; j < y_COLUMNS ; ++j)
         {
             squares[i][j] = arr[i][j];
         }
    }
}

问题是它不接受我的 returnPiece(),如果我删除“[4][4]”,我的编译器不接受。

这些大多都是语法错误,但是我该如何解决这些问题呢?

  1. 在 returnPiece() 中返回整个 pieceArray
  2. InsertArray() 中参数的正确语法
  3. InsertArray() 的参数接受 returnPiece()

这 3 个是我需要帮助解决的主要问题,并且在尝试使用指针指针方法时遇到了同样的问题。有谁知道如何解决这 3 个问题?

最佳答案

传递数组时,您必须决定是要复制数组,还是只想返回指向数组的指针。对于返回数组,您不能(轻松地)返回一个拷贝——您只能返回一个指针(或 C++ 中的引用)。例如:

// Piece::returnPiece is a function taking no arguments and returning a pointer to a
// 4x4 array of integers
int (*Piece::returnPiece(void))[4][4]
{
    // return pointer to the array
    return &pieceArray;
}

要使用它,请这样调用它:

int (*arrayPtr)[4][4] = myPiece->returnPiece();
int cell = (*arrayPtr)[i][j];  // cell now stores the contents of the (i,j)th element

请注意类型声明和使用它之间的相似性 - 圆括号、取消引用运算符 * 和方括号位于相同的位置。

您对 Grid::InsertArray 的声明是正确的 - 它有一个参数,即一个 4x4 整数数组。这是按值调用:无论何时调用它,都会复制 4x4 数组,因此您所做的任何修改都不会反射(reflect)在传入的数组中。如果您想使用按引用调用,您可以传递一个指向数组的指针:

// InsertArray takes one argument which is a pointer to a 4x4 array of integers
void Grid::InsertArray(int (*arr)[4][4])
{
     for(int i = 0; i < x_ROWS; i++)
     {
         for(int j = 0; j < y_COLUMNS ; j++)
             squares[i][j] = (*arr)[i][j];
     }
}

这些带有指向多维数组指针的类型声明很快就会变得非常困惑。我建议像这样为它制作一个 typedef:

// Declare IntArray4x4Ptr to be a pointer to a 4x4 array of ints
typedef int (*IntArray4x4Ptr)[4][4];

然后你可以声明你的函数更具可读性:

IntArray4x4Ptr Piece::returnPiece(void) { ... }
void Grid::InsertArray(IntArray4x4Ptr arr) { ... }

您还可以使用 cdecl帮助破译复杂的 C/C++ 类型的程序。

关于C++ 返回和插入二维数组对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/402432/

相关文章:

c++ - 在 cygwin 终端中运行时显示不存在的文件夹的 cmake 错误

c++ - 语法检查器指出一些我不知道为什么的错误

C 结构体指针数组

c++ - 仅打印数组的某些元素

parsing - 以 `FullForm` 语法保存 Mathematica 代码

c++ - MFC CListCtrl 在单元格上显示文本框供用户编辑

c++ - 如果正确使用时它从不抛出,我是否应该声明一个方法 noexcept ?

Java检查字符串中的所有字符是否存在于给定的字符串数组中

c - 检查相邻数组的简单方法

swift - 从 swift 1.0 到 1.2 的固定功能