首页 > 解决方案 > 如何使用指针 C++ 将元素从 2D 数组复制到 1D 数组

问题描述

我有一个功能

double* get_row(double *the_array, int row_num, int col_size)    

其中the_array是 2D 数组,row_num是 2D 数组上我要从中复制值的行号,并且col_size是 2D 数组的列大小。

功能实现

double* get_row(double *the_array, int row_num, int col_size) {

    double* row = new double[col_size];

    for (int i = 0; i < col_size; i++) {

        *row = *(*(the_array + row_num) + i);
        row++;
    }

    delete[] row;

    return row;
}

我试图将row_num二维数组的行中的值复制the_array到一维数组row中,但编译器在 *row = *(*(the_array + row_num) + i);我用来将元素从一个数组复制到另一个数组的行上给了我一个错误,完成此类任务的正确方法是什么。

顺便说一句,我从 Visual Studio 得到的错误是:'*' 的操作数必须是一个指针。

感谢您的帮助。

标签: c++pointers

解决方案


为了解决这个问题,我假设“col_size”实际上是“列数”。并且数据按行优先顺序排列。

然后第 N 行的开始位于the_array + row_num*col_size

我将从这个辅助函数开始:

inline double* view_row_n( double* array, int row, int num_cols ) {
  return array+row*num_cols;
}

然后我会写一个复制缓冲区:

 std::unique_ptr<double[]> copy_buffer( double const* in, int count ) {
   double* retval = new double[count];
   std::memcpy( retval, in, sizeof(double)*count );
   return std::unique_ptr<double[]>( retval );
 }

现在我将它们一起使用:

double* get_row( double* the_array, int row_num, int col_size) {
  auto retval = copy_buffer( view_row_n( the_array, row_num, col_size), col_size );
  return retval.release();
}

并完成它。

我也会改变:

double* get_row( double const* the_array, int row_num, int col_size) {

乃至:

std::unique_ptr<double[]> get_row( double const* the_array, int row_num, int col_size) {

但这超出了您的问题范围。


推荐阅读