如何使用指针C++将元素从2D数组复制到1D数组
How to you copy elements from a 2D array into a 1D array using pointers C++
我有一个函数
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;
}
我试图将值从2D数组the_array
的行row_num
复制到1D数组row
,但编译器在行上给了我一个错误*row = *(*(the_array + row_num) + i);
,我用它将元素从一个数组复制到另一个数组,完成这项任务的正确方法是什么。
顺便说一句,从visual studio获取的错误是:"*"的操作数必须是指针。
谢谢你的帮助。
为了解决这个问题,我假设"col_size"实际上是"列数"。并且数据按行主顺序排列。
则第N行的起始位置位于CCD_ 8处。
我将从这个助手功能开始:
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) {
但这超出了你的问题范围。
如果get_row
不需要将新内存分配回调用者,那么解决方案就是
double* get_row(double *the_array, int row_num, int col_size)
{
return the_array + (row_num * col_size);
}
如果调用者期望为返回的行分配新的内存,那么
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[i] = *(the_array + (row_num * col_size) + i);
return row;
}
会起作用。
在第一个解决方案中,其想法是使用row_num * col_size
到达正确的行,并简单地返回该地址位置作为结果。在第二个解决方案中,我们首先声明一个新行。然后使用i
对该行中的每个单独元素进行索引,并从由the_array + (row_num * col_size)
索引的该行的the_array
复制每个元素。
这不是现代C++,显然不应该删除返回值。
im试图将2D数组的row_num行中的值复制到_array进入1D阵列
首先,the_array
在本文中被定义为原始指针并用于指针运算,是2D数组的1D表示——在我们的描述中更准确。
获取[…]时的错误为:"*"的操作数必须是指针
好的,所以这行:
*row = *(*(the_array + row_num) + i);
有点乱。我想我知道你要怎么做了,但看,你无缘无故地两次取消引用(在表达式左侧使用*
),这是BTW导致错误的原因。请记住,我们说过the_array
是原始指针,被视为1D数组。因此,您可以使用这种类型的指针算术,比方说在括号内,然后只取消引用一次。上面的表达式获取(the_array + row_num)
的结果地址,取消引用它以获得数组的此单元格中的double
,然后将i
添加到double
值本身,然后尝试取消引用double
和int i
的和——这是double
类型的临时变量。这可能是你的目标:
*row = *(the_array + row_num * col_size + i);
因为2D数据在存储器中被传染传播,逐行,连续,您需要将这样的行索引乘以行大小(这也是列数,我认为col_size
实际上就是这样,否则您无法在行之间遍历)来"在行之间跳过">,最后添加当前单元格索引i
以到达行内的特定单元格。然后,就像我们说的,取消整个事情。
除了编译问题和地址计算之外,在循环中递增row
之前,您至少应该保留它的地址,这样您就可以返回它,而不是经过行末尾的指针为了尽可能多地保留您的原始函数,您可以使用第二个指针来完成它,如下所示:
double* get_row(double *the_array, int row_num, int col_size) {
double* row = new double[col_size];
double* rowPtr = row;
for (int i = 0; i < col_size; i++) {
*rowPtr = *(the_array + row_num * col_size + i);
rowPtr++;
}
return row;
}
我正在努力让它尽可能接近你的版本,这样你就可以看到与你所做的不同。很多事情都可以用不同的方式来做,例如为什么不像这个row[i] = *(the_array + row_num * col_size + i);
一样首先使用[]
运算符,然后完全去掉第二个指针?如果您按原样迭代i
,则不需要在循环中的第二行执行++
。另一个例子是您是否必须分配,或者您是否可以只返回一个指向现有数组的指针,但位置正确?
这里不需要提及的是,在几乎任何情况下,您都不应该像这样返回原始指针,因为这很容易导致代码中的意图不明确,即谁拥有分配(并负责最终删除分配),并提出了如何在出现异常时防止内存泄漏的问题?首选的解决方案是使用智能指针,如std::unique_ptr
,它的一个实例封装原始指针并生成它,因此如果你想以不安全的方式丢弃那块内存,你必须非常明确。
double* get_row(double *the_array, int row_num, int col_size) {
double* row = new double[col_size];
for (auto i = 0; i < col_size; ++i) {
row[i] = the_array[row_num * col_size + i];
}
// If the return isn't assigned, the program will leak!
return row;
}
void row_test() {
double two_d[15];
const auto row = get_row(two_d, 2, 5);
// ...
// Be sure to delete row afterwards
delete[] row;
}
- 2D数组来自文本输入,中间有空格
- 如何使用用户输入在C++中正确填充2D数组
- 如何在C++中检查2D数组中负值的输入验证
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 如何在C++函数中声明静态 2D 数组?
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 使用矢量将文本文件中的输入存储到 2D 数组中
- 获取 2D 数组 c++ 中的所有数字对
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 如何在构造函数中使用初始值设定项设置具有相同值的 2d 数组?
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 如何打印 2D 字符数组C++
- 如何将数组 2d 作为参数从函数传递并返回数组 2d 此函数
- 数组 2D 多个值
- 创建数组数组 (2D),而无需在 Java 中初始化内部数组
- 如何在C++中将文本文件传输到数组2D
- 从同一类的另一个方法调用数组2D-C++
- 获取地址在数组2d中的位置