簡體   English   中英

C++ 通過引用傳遞數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM