gpt4 book ai didi

c++ - C++函数更改传递参数的值

转载 作者:行者123 更新时间:2023-12-02 09:58:24 25 4
gpt4 key购买 nike

我有一个简单的交换函数,用于获取整数数组,并返回具有交换值的新数组。

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语言方式:mallocmemcpy由于要返回一个新数组,因此应该返回一个新数组。为此,您应该使用malloc分配新的内存区域,然后使用memcpy将原始数组的值复制到新的内存区域。
请注意,不可能仅使用函数的当前参数来执行此操作,因为这些参数均不能指示数组的大小:

  • data是指向数组第一个元素的指针;
  • n_index是数组中元素之一的索引;
  • swap_index是数组中另一个元素的索引。*

  • 因此,您应该在函数 int size中添加第四个元素,以指定数组中有多少个元素。您可以将 size用作 mallocmemcpy的参数,或者编写一个遍历数组元素的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::vectorstd::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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com