【问题标题】:Call by Reference or by Value?通过引用还是按值调用?
【发布时间】:2017-07-23 19:34:30
【问题描述】:

我刚开始使用C++,基础是C。通过引用了解了Call,我需要知道,如果我在网上找到了以下函数:

int insertSorted(int arr[], int n, int key, int capacity)
{
    if (n >= capacity)
        return n;

    arr[n] = key;
    return (n+1);
}

,用于插入未排序的数组,主函数中的数组会受到影响/更改吗?由于函数中的arr[] 参数不是引用变量,那么这个被调用函数的任何变化如何反映在调用函数中?如果有的话,这是正确的代码吗?我的问题基于这样一个事实,即按值调用会创建复制变量并更改它们,而按引用调用会更改实际变量本身。如果这个问题有点愚蠢,我很抱歉。 澄清这个概念的任何帮助都会很棒。

谢谢。

【问题讨论】:

  • "数组是引用" - 不,它们不是。
  • @OmidCompSCI - 不,他们不是。它们衰减为指针,指针按值传递。
  • 不幸的是,要理解这一点,您还需要理解指针。指针有点像引用,但也有本质的不同:(
  • 有点相关:在 C++ 中你不应该使用原始数组,而是使用 std::vectorstd::array
  • @AngadSingh - 你的代码相当于int insertSorted(int *arr, int n, int key, int capacity)。所以你实际上是通过值传递一个指针。因此对指针本身的更改(例如arr = NULL)将不会反映在调用者中。但是,指针指向的事物的变化反映。

标签: c++ pass-by-reference call-by-value


【解决方案1】:

arr 实际上是指向数组的指针。因此,在您的情况下,它就像一个引用,并且该函数更改数组 arr 指向。

如果您想更多地使用 C++ 方式,您应该为您的数组使用 std::vector<int> 而不是 int[]std::vector 具有 C 样式数组的所有功能,但负责内存管理和元素的实际数量。

如果是std::vector,您确实必须传递一个引用 (std::vector &),否则该函数将收到整个数组的副本。

【讨论】:

  • "arr 实际上是指向数组的指针" arr 实际上是指向int 的指针。指向数组的指针是不同的。
  • 这就是为什么我写“有效地”来指出它不是严格指向数组的指针。
猜你喜欢
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2020-04-01
  • 1970-01-01
  • 2014-05-18
  • 2016-03-27
相关资源
最近更新 更多