我必須定義一個函式來洗掉陣列中的元素,這是代碼
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可以解決問題,但是我不明白這里的原因。如果您能幫我解決這個問題,我將不勝感激!
uj5u.com熱心網友回復:
如果使用void delete_element(int a[], int n, int pos),則引數將復制到函式中。因此,如果您使用 減少 n --n;,它只會影響“本地”n,即副本。
如果使用void delete_element(int a[], int& n, int pos),則引數 n 由參考填充。這意味著,函式中沒有使用本地副本,而是來自“外部世界”的變數 n。
因此,--n;現在將影響作為函式引數給出的變數。您可以通過將指標傳遞給變數來創建相同的行為。在這種情況下,地址被復制,但它指向的記憶體位置(原始變數)將被修改而不是被復制的地址。
uj5u.com熱心網友回復:
- 該函式實際上并沒有洗掉陣列中的元素,因為它只是將at 處的資料
pos與下一個資料重疊,并且大小沒有改變。 - 這似乎
n是陣列的大小,所以當你使用時int n,大小作為值傳遞,所以外層n不會改變。當您使用 時int& n,大小作為參考傳遞,因此n會發生變化。 - 如果要實際洗掉陣列中的某個元素,可以參考
pop_back()或 的pop_front()函式vector。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/403178.html
標籤:
上一篇:創建鏈表時使用“new”
下一篇:陣列名和指標
