我有一个简单的交换函数,用于获取整数数组,并返回具有交换值的新数组。
int* Node::dataSwap(int *data, int n_index, int swap_index){
printDatt(data);
int *path = data;
int swapped = data[n_index];
int to_swap = data[swap_index];
path[n_index] = to_swap;
path[swap_index] = swapped;
printDatt(data);
return path;
}
但是,此功能正在更改对原始数据的引用。输出看起来像这样(打印与控制台应该相同的数据)。0, 1, 2
3, 4, 5
6, 7, 8
0, 1, 2
3, 4, 8
6, 7, 5
为什么不更改“数据”时会更改它? “路径”是对“数据”的实际内存地址的引用吗? 最佳答案
参数data
和局部变量path
的类型为 int *
。您可以将其视为“指向int的指针”。
指针是保存内存地址的变量。仅此而已。由于设置了path = data
,所以这两个指针相等。
在您看来,data
是一个数组。但这不是dataSwap
函数所看到的。对于函数dataSwap
,其参数data
只是一个指向int的指针。此int是数组的第一个元素。您使用data[n_index]
访问了数组的元素;但这只是*(data + n_index)
的同义词。
如何解决您的问题?
C语言方式:malloc
和memcpy
由于要返回一个新数组,因此应该返回一个新数组。为此,您应该使用malloc
分配新的内存区域,然后使用memcpy
将原始数组的值复制到新的内存区域。
请注意,不可能仅使用函数的当前参数来执行此操作,因为这些参数均不能指示数组的大小:
data
是指向数组第一个元素的指针; n_index
是数组中元素之一的索引; swap_index
是数组中另一个元素的索引。* 因此,您应该在函数
int size
中添加第四个元素,以指定数组中有多少个元素。您可以将size
用作malloc
和memcpy
的参数,或者编写一个遍历数组元素的for循环。出现新问题:如果您调用
malloc
分配新的内存,那么用户将不得不在某些时候调用free
释放内存。C++具有很酷的关键字
new
,其语法比malloc
的语法更轻巧。但这并不能解决主要问题。如果使用关键字new
分配新的内存,那么用户将不得不在某个时候使用关键字delete
释放内存。gh,这么重的负担!
但这是C方式。在C++中,一个好的经验法则是:从不手动处理数组。标准库为此提供了
std::vector
。在某些情况下,使用new
可能是最佳解决方案。但在大多数情况下,事实并非如此。C++方式:
std::vector
使用标准库中的std::vector
类,您的代码将变为:#include <vector>
std::vector<int> Node::dataSwap(std::vector<int> data, int n_index, int swap_index)
{
std::vector<int> new_data = data;
int swapped = data[n_index];
int to_swap = data[swap_index];
new_data[n_index] = to_swap;
new_data[swap_index] = swapped;
return (new_data);
}
没有malloc
,没有new
,没有free
和没有delete
。类std::vector
在内部处理所有这些。您也不需要手动复制数据。初始化new_data = data
调用std::vector
类的副本构造函数,并为您完成此操作。尽量避免使用
new
;使用一个内部处理所有内存的类,就像您希望使用更高级的语言一样。或者,甚至更简单:
C++方式:
std::vector
和std::swap
#include <vector>
#include <algorithm>
std::vector<int> Node::dataSwap(std::vector<int> data, int n_index, int swap_index)
{
std::vector<int> new_data = data;
std::swap(new_data[n_index], new_data[swap_index]);
return (new_data);
}
关于c++ - C++函数更改传递参数的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64030838/