[英]C++ pass an array by reference
這允許通過引用傳遞數組嗎?
void foo(double& *bar)
似乎我的編譯器說不。 為什么? 通過引用傳遞數組的正確方法是什么? 還是解決方法? 我有一個數組參數,我的方法應該修改它,然后我應該檢索它。 或者,我可以使這個數組成為 class 成員,它工作正常,但它對我的代碼的其他部分有很多缺點(我想避免)。
感謝致敬。
Arrays只能通過引用傳遞,實際上:
void foo(double (&bar)[10])
{
}
這可以防止您執行以下操作:
double arr[20];
foo(arr); // won't compile
為了能夠將任意大小的數組傳遞給foo
,將其設為模板並在編譯時捕獲數組的大小:
template<typename T, size_t N>
void foo(T (&bar)[N])
{
// use N here
}
你應該認真考慮使用std::vector
,或者如果你有一個支持 c++11 的編譯器, std::array
。
是的,但是當引用參數匹配時,指針的隱式數組不是自動的,所以你需要這樣的東西:
void foo( double (&array)[42] );
要么
void foo( double (&array)[] );
但是請注意,在匹配時, double [42]
和double []
是不同的類型。 如果你有一個未知維度的數組,它會匹配第二個,但不會匹配第一個,如果你有一個包含 42 個元素的數組,它會匹配第一個,但不會匹配第二個。 (恕我直言,后者非常違反直覺。)
在第二種情況下,你還必須通過維度,因為一旦你進入 function 就無法恢復它。
當您使用 C++ 時,這里仍然缺少的強制性建議是使用std::vector<double>
。
您可以輕松地通過引用傳遞它:
void foo(std::vector<double>& bar) {}
如果你有 C++11 支持,也可以看看std::array
。
以供參考:
如果只想修改元素:
void foo(double *bar);
足夠。
如果你想修改地址為(eg: realloc
),但它對 arrays 不起作用:
void foo(double *&bar);
是正確的形式。
8.3.5.8 如果參數的類型包括“T 的未知邊界數組的指針”或“T 的未知邊界數組的引用”形式的類型,則程序格式錯誤
就像其他答案所說的那樣,將&
放在*
之后。
這提出了一個有趣的觀點,有時可能會造成混淆:類型應該從右到左閱讀。 例如,這是(從最右邊的*
開始)指向指向 int 的常量指針的指針。
int * const *x;
因此,您寫的內容將是指向引用的指針,這是不可能的。
在這里,Erik 解釋了通過引用傳遞數組的每種方式: https://stackoverflow.com/a/5724184/5090928 。
同樣,您可以像這樣創建一個數組引用變量:
int arr1[] = {1, 2, 3, 4, 5};
int(&arr2)[5] = arr1;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.