为什么我必须使用 int &n 而不是 int n 作为参数?

why do I have to use int &n instead of int n as parameter?

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

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可以解决问题,但我不明白这里的原因。如果您能帮助我,我将不胜感激!

  1. 这个函数实际上并没有删除数组中的元素,因为它只是将pos处的数据与下一个数据重叠,并且大小没有改变。
  2. 似乎n是数组的大小,所以当你使用int n时,大小作为值传递,所以外部n没有改变。当您使用 int& n 时,大小将作为参考传递,因此 n 将被更改。
  3. 如果实际要删除数组中的元素,可以参考vectorpop_back()pop_front()函数。

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

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