【问题标题】:why do I have to use int &n instead of int n as parameter?为什么我必须使用 int &n 而不是 int n 作为参数?
【发布时间】:2022-01-04 08:35:59
【问题描述】:

我必须定义一个函数来删除数组中的一个元素,这里是代码

void delete_element(int a[], int n, int pos)
{
    if (pos>=n)
    pos=n-1;
    else if (pos<0)
    pos=0;
    for (int i=pos-1;i<n-1;i++)
    {
        a[i]=a[i+1];
    }
    --n;
}

这是一个例子:

int n;
printf("Enter the length of the array: ");
scanf("%d", &n);
int A[n]
for (int i=0;i<n;i++)
scanf("%d", &A[i]);
delete_element(A,n,2);

假设n=5,A = {1,2,3,4,5},运行上述代码后,会打印出{1,3,4,5,5}

当我使用 int n 作为参数时,函数会删除我想要的元素,但最后一个元素会在数组中出现两次。搜索了一下,发现使用int &n可以解决问题,但是不明白这里的原因。如果您能帮我解决这个问题,我将不胜感激!

【问题讨论】:

  • 这是 C++ 代码,不是 C。
  • 请出示minimal reproducible example,猜测代码的调用者不会更新数组的大小?
  • 尝试搜索“通过引用传递值”?
  • 这个函数不会删除任何东西,不管n是怎么取的。它只是移动数组中的元素。
  • 您无法更改 C 样式数组的大小,因此您无法从中删除元素。你只能改变他们的价值观,这就是你正在做的事情。要实际删除一个元素,您必须创建一个减小大小的新数组并将元素复制到该新数组中。但是,在 C++ 中,您应该更喜欢 std::vector&lt;T&gt;,它可以为您提供所需的可调整大小数组的语义。

标签: c++ arrays pointers parameters


【解决方案1】:

如果您使用void delete_element(int a[], int n, int pos),参数将被复制到函数中。 所以如果你使用--n;来减少n,它只会影响“本地”n,即副本。

如果你使用void delete_element(int a[], int&amp; n, int pos),参数n被引用填充。这意味着,函数中没有使用本地副本,而是来自“外部世界”的变量 n。
因此,--n; 现在将影响作为参数提供给函数的变量。 您可以通过将指针传递给变量来创建相同的行为。在这种情况下,地址被复制,但它指向的内存位置(原始变量)将被修改,而不是复制的地址。

【讨论】:

  • 非常感谢,我终于明白了。
  • 请避免发布 gfg 的链接。该站点是质量极差的 C++ 代码示例的集合,初学者最好避免使用。
  • 哦,好的,谢谢@Evg。什么会更好?
  • 通常我们指的是this list中的介绍性书籍。
【解决方案2】:
  1. 这个函数实际上并没有删除数组中的元素,因为它只是将pos处的数据与下一个数据重叠,并且大小没有改变。
  2. 看来n是数组的大小,所以当你使用int n时,大小是作为值传递的,所以外层n不会改变。而当你使用int&amp; n时,大小作为参考传递,所以n会改变。
  3. 如果要实际删除数组中的元素,可以参考vectorpop_back()pop_front()函数。

【讨论】:

  • 非常感谢,我想通了。但这意味着如果我想在函数中更改 n 的值,我必须使用 int &n 而不是 int n,我做对了吗?
  • @ThienAnh 是的。在大多数情况下,引用比值快,因此如果您不想更改值,也可以使用const int&amp; n
  • 引用通常更快,像int这样的原始类型几乎永远应该由const-ref传递。
  • @Evg 是的,参考对于更复杂的类型更有用,感谢补充
猜你喜欢
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 2020-02-23
  • 1970-01-01
  • 2016-05-11
相关资源
最近更新 更多