为什么我必须使用 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可以解决问题,但我不明白这里的原因。如果您能帮助我,我将不胜感激!
- 这个函数实际上并没有删除数组中的元素,因为它只是将
pos
处的数据与下一个数据重叠,并且大小没有改变。
- 似乎
n
是数组的大小,所以当你使用int n
时,大小作为值传递,所以外部n
没有改变。当您使用 int& n
时,大小将作为参考传递,因此 n
将被更改。
- 如果实际要删除数组中的元素,可以参考
vector
的pop_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;
现在将影响作为函数参数提供的变量。
您可以通过将指针传递给变量来创建相同的行为。在这种情况下,地址被复制,但不是复制的地址,而是它指向的内存位置,即原始变量,将被修改。
我必须定义一个函数来删除数组中的元素,这是代码
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可以解决问题,但我不明白这里的原因。如果您能帮助我,我将不胜感激!
- 这个函数实际上并没有删除数组中的元素,因为它只是将
pos
处的数据与下一个数据重叠,并且大小没有改变。 - 似乎
n
是数组的大小,所以当你使用int n
时,大小作为值传递,所以外部n
没有改变。当您使用int& n
时,大小将作为参考传递,因此n
将被更改。 - 如果实际要删除数组中的元素,可以参考
vector
的pop_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;
现在将影响作为函数参数提供的变量。
您可以通过将指针传递给变量来创建相同的行为。在这种情况下,地址被复制,但不是复制的地址,而是它指向的内存位置,即原始变量,将被修改。