是否允許通過引用傳遞數組?C++通過引用傳遞數組
void foo(double& *bar)
似乎我的編譯器說不。爲什麼?什麼是通過引用傳遞數組的正確方法?還是解決辦法?我有一個數組參數,我的方法應該修改,然後我應該檢索。另外,我可以使這個數組成爲一個類的成員,這很好,但它對我的代碼的其他部分(我想避免)有很多缺點。
感謝和問候。
是否允許通過引用傳遞數組?C++通過引用傳遞數組
void foo(double& *bar)
似乎我的編譯器說不。爲什麼?什麼是通過引用傳遞數組的正確方法?還是解決辦法?我有一個數組參數,我的方法應該修改,然後我應該檢索。另外,我可以使這個數組成爲一個類的成員,這很好,但它對我的代碼的其他部分(我想避免)有很多缺點。
感謝和問候。
數組只能通過引用傳遞,實際上是:
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
的編譯器。
「仍然,一旦傳遞給'foo',數組衰減到指針」。不,它不會,因爲只能傳遞10個元素的數組,所以不需要關於大小的更多信息。 (再一次,你不能傳遞一個數組到'void foo(double * &)';)隱式轉換的結果是一個右值,不能用於初始化非const的引用,你必須使用void foo(double * const &);'。 – 2012-04-04 09:40:28
好吧,我糾正了,我刪除了有爭議的部分。 – jrok 2012-04-04 09:46:53
很棒:)這正是我想要的。我在模板中做了void foo(T&bar [N])'但實際上意味着「引用數組」而不是「引用數組」 – OLL 2015-11-05 11:23:48
如果你想修改剛剛元素:
void foo(double *bar);
就足夠了。
如果要修改地址(例如:realloc
),但它並不適用於陣列工作:
void foo(double *&bar);
是正確的形式。
除了你不能將數組傳遞給後者。他問了數組,而不是指針。 – 2012-04-04 09:28:05
@JamesKanze:是的。第二種情況不適用於堆棧上的數組,在這種情況下,他應該使用第一種形式。 – Naszta 2012-04-04 09:30:53
第二種情況不適用於數組,句點。它只有在你有一個指針類型的實際變量時纔有效。 – 2012-04-04 09:41:34
像對方回答說的那樣,把&
後面的*
。
這提出了一個有趣的觀點,有時候會引起混淆:類型應該從右到左讀取。例如,這是(從最右邊的*
開始)指向指向int的常量指針的指針。
int * const *x;
因此,您所寫的內容是指向引用的指針,這是不可能的。
更改順序仍然不允許他傳遞數組。它需要一個實際的指針對象,而不是轉換的結果。 – 2012-04-04 09:29:26
由於您使用的是C++,此處仍然缺少的強制性建議是使用std::vector<double>
。
您可以輕鬆地引用傳遞:
void foo(std::vector<double>& bar) {}
如果你有C++ 11的支持,也看看std::array
。
參考:
:-)是的。 'std :: vector'通常是最好的解決方案。但也有例外。 – 2012-04-04 09:28:50
是的。 :) +1爲'std :: vector' – Naszta 2012-04-04 09:31:57
是的,但是當一個引用參數匹配,隱式陣列 指針不是自動的,所以你需要像:
void foo(double (&array)[42]);
或
void foo(double (&array)[]);
注意,但是,當匹配,double [42]
和double []
是 截然不同的類型。如果您有一個未知尺寸的數組,它將與第二個匹配,但不是第一個,如果您有一個包含42 元素的數組,它將匹配第一個,但不匹配第二個。(後者, 恕我直言,非常反直覺的。)
在第二種情況下,你也必須通過尺寸,因爲 沒有辦法,一旦你裏面的功能來恢復它。
8.3.5.8如果參數的類型包括「與結合的T未知的數組指針」或類型的形式是「參考 與結合的T未知的陣列」,該程序是非法的構造
它是什麼編譯器? – RedX 2012-04-04 09:02:20
檢查[順時針螺旋規則](http://c-faq.com/decl/spiral.anderson.html)。 – 2012-04-04 09:03:31
你有沒有考慮過使用'std :: vector'或類似的東西? – moooeeeep 2012-04-04 09:06:10