[英]C++ - Pass by Reference, Weird Thing for Array
據我所知,C ++使用Ampersand(&)進行引用傳遞。 但是我只是測試了這段代碼,我不知道為什么第二個功能看起來和第一個功能相似。 似乎第二個功能是現在通過引用傳遞功能。
#include <iostream>
using namespace std;
void f1(int (&b)[5])
{
b[0]=1;
}
void f2(int b[5])
{
b[1]=2;
}
int main()
{
int a[5];
f1(a);
f2(a);
cout<<a[0]<<endl;
cout<<a[1]<<endl;
}
輸出:
1
2
有人可以向我解釋一下嗎? 謝謝。
將數組傳遞給函數時,它會退化為指針。 因此,無論哪種情況,結果都是相同的。
因此,在f2
情況下, b
是一個指針,它指向數組a始於的相同位置。 還請記住,數組索引[ a[i]
]和指針算術和解引用[ *(a+i)
]是同義詞。 因此,在第二種情況下,您最終將更新傳遞的原始數組。
現在,這兩個聲明之間有細微的差別。 在f1
情況下,參數b
是對原始數組a
的引用,因此b
仍然是具有源數組所有特征的同一數組。 在第二個表達式的情況下, b
只是一個指針,偶然地指向數組a
的位置。
考慮到參數理想上是不同的事實,它們具有不同的行為
為了完整起見,這里有一個更新的程序,它將使您更加了解行為的不同之處。
#include <iostream>
using namespace std;
void f1(int (&b)[5])
{
std::cout<<sizeof(b)<<std::endl;
//b = new int[5]; -- Will give compile error
b[0]=1;
}
void f2(int b[5])
{
std::cout<<sizeof(b)<<std::endl;
//b = new int[5]; -- Will compile fine
b[1]=2;
}
int main()
{
int a[5];
f1(a);
f2(a);
cout<<a[0]<<endl;
cout<<a[1]<<endl;
}
數組始終“通過引用傳遞” 。 數組的名稱是一個指針
到數組的第一個元素。 因此,參數int b[5]
第二個函數與int* b
基本相同。
默認情況下,數組由指針傳遞,即數組的基地址。 因此,在f2()
將a
的基地址復制到b
以便可以以正常指針方式從函數中對其進行訪問。
當您通過引用傳遞數組時,它不占用任何額外的內存,而只是重命名它,您仍然可以以與塊中相同的方式(通過使用為其賦予的別名)訪問該數組。您最初是在定義它。
希望能有所幫助...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.