【问题标题】:c++ : pass 2d-array by reference?c++:通过引用传递二维数组?
【发布时间】:2020-06-29 20:49:51
【问题描述】:

我正在重新使用 C++,但在弄清楚如何将二维数组传递给函数时遇到了麻烦。下面的代码是我目前的尝试,我已经能够使用以下方法通过引用传递向量字符串:

vector<string> g_dictionary;
getDictionaryFromFile(g_dictionary, "d.txt");
...
void getDictionaryFromFile(vector<string> &g_dictionary, string fileName){..}

但是当我尝试像下面这样对我的二维数组做同样的事情时,我在“solve_point(boardEx);”这一行得到一个错误表示 char & 类型的引用不能用 boardEx[5][4] 类型的值初始化

#include <stdio.h>   
#include <string>
using namespace std;

void solve_point(char* &board){ 
    printf("solve_point\n");
    //board[2][2] = 'c';
}

int main(){
    char boardEx[5][4];
    solve_point(boardEx);
}

【问题讨论】:

  • 您的编辑使您的 C++ 代码无效,因为 C++ 没有 variable-length arrays。这使我的std::vector 解决方案成为唯一可能的便携式和标准解决方案。
  • 请不要以这样的方式编辑您的帖子,以致针对原始帖子发布的答案已过时。
  • 还原代码以使正确答案再次正确。提出一个新问题比让现有问题无效要好。

标签: c++ arrays pointers parameter-passing


【解决方案1】:

char*&amp; 类型是对指针的引用。 “二维”数组衰减为指向数组的指针。

对于您的数组boardEx,它将衰减为char(*)[4] 类型,该类型需要您的函数接受的类型:

void solve_point(char (*board)[4]) { ... }

或者你可以使用模板来推断数组维度

template<size_t M, size_t N>
void solve_point(char (&board)[M][N]) { ... }

或者使用std::array:

std::array<std::array<char, 5>, 4> boardEx;

...

void solve_point(std::array<std::array<char, 5>, 4> const& board) { ... }

或者使用std::vector:

std::vector<std::vector<char>> boardEx(5, std::vector<char>(4));

...

void solve_point(std::vector<std::vector<char> const& board) { ... }

考虑到问题的编辑,使用std::vector 的解决方案是唯一可能的可移植和标准解决方案。

【讨论】:

  • 谢谢,我忘记在我的问题中包含我正在尝试为动态分配的数组执行此操作。我编辑了我的问题以反映我的 boardEx 是使用两个 int 变量而不是硬编码数字初始化的
【解决方案2】:

可以使用以下方式定义对二维数组的引用:

char (&ref)[5][4] = boardEx;

您可以更改函数以使用相同的语法。

void solve_point(char (&board)[5][4]){ 
    printf("solve_point\n");
    //board[2][2] = 'c';
}

对于动态分配的数组,最好使用std::vector

int width = 7;
int height = 9;
char boardEx[width][height];

被一些编译器作为扩展支持,但它不是标准的 C++。相反,使用:

int width = 7;
int height = 9;
std::vecotr<std::vector<char>> boardEx(width, std::vector(height));

相应地更新solve_point

【讨论】:

    【解决方案3】:

    您可以通过值或引用声明接受数组的函数。

    例如(按值)

    void solve_point( char ( *board )[4] ){ 
        printf("solve_point\n");
        //board[2][2] = 'c';
    }
    
    int main(){
        char boardEx[5][4];
        solve_point(boardEx);
    }
    

    或者(通过引用)

    void solve_point(char ( &board )[5][4] ){ 
        printf("solve_point\n");
        //board[2][2] = 'c';
    }
    
    int main(){
        char boardEx[5][4];
        solve_point(boardEx);
    }
    

    在这两种情况下,您都可以使用这样的表达式访问数组的元素

    board[i][j] = 'c';
    

    请记住,如果您有一个像这样的多维数组

    T a[N1][N2][N3];
    

    其中T 是某个类型说明符,那么您可以通过以下方式重写声明

    T ( a[N1] )[N2][N3];
    

    现在要获取指向数组元素的指针,只需将 ( a[N1] ) 替换为 ( *pa ) 即可

    T ( *pa )[N2][N3] = a;
    

    要获得对数组的引用,请重写其声明

    T ( a )[N1][N2][N3];
    

    并将( a ) 替换为( &amp;ra ) 喜欢

    T ( &ra )[N1][N2][N3] = a;
    

    如果你想写一个函数,通过引用接受不同大小的二维数组,那么你可以写

    template <typename T, size_t M, size_t N>
    void solve_point( T ( &board )[M][N] ){ 
        //...
    }
    
    int main(){
        char boardEx[5][4];
        solve_point(boardEx);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      • 2010-10-06
      • 2012-08-05
      • 2020-12-16
      相关资源
      最近更新 更多