2011-04-20 106 views
120

如何通過引用傳遞靜態分配的數組?通過引用傳遞數組

void foo(int (&myArray)[100]) 
{ 
} 

int main() 
{ 
    int a[100]; 
    foo(a); 
} 

是否(&myArray)[100]有任何意義或它只是一個語法按引用傳遞任何陣列? 我不明白單獨的括號後面跟着大括號。謝謝。

+0

是否有任何與函數參數的左值和右值的關係? – 2011-04-20 00:16:14

+0

可能的重複[什麼是有用的數組引用參數?](http://stackoverflow.com/questions/2188991/what-is-useful-about-a-reference-to-array-parameter) – AnT 2011-04-20 00:25:59

+0

[有關引用數組參數的有用信息?](https://stackoverflow.com/questions/2188991/what-is-useful-about-a-reference-to-array-parameter) – anatolyg 2017-07-08 23:07:43

回答

162

這是數組引用的語法 - 您需要使用(&array)來向編譯器說明您希望對數組引用,而不是引用int & array[100];的(無效)數組。

編輯:一些澄清。

void foo(int * x); 
void foo(int x[100]); 
void foo(int x[]); 

這三種是聲明相同功能的不同方式。他們都被視爲採取int *參數,您可以傳遞任何大小的數組給他們。

void foo(int (&x)[100]); 

這隻接受100個整數的數組。這是不合法的 - 你可以在x

void foo(int & x[100]); // error 

這被解析爲「中引用數組」安全使用sizeof

+0

爲什麼我們不能有一個引用數組例如'int a,b,c; int arr [3] = {a,b,c};'? – Vorac 2016-01-07 13:10:53

+4

啊哈,發現[爲什麼](http://stackoverflow.com/questions/1164266/why-arrays-of-references-are-illegal#1164306)。 – Vorac 2016-01-08 13:51:50

+1

有人可以解釋爲什麼'void foo(int&x [100]);'被解析爲「引用數組」?是因爲「從右到左」的規則?如果是的話,它似乎不符合'void foo(int(&x)[100]);'被解析爲「對數組的引用」。提前致謝。 – zl9394 2017-02-11 00:52:34

35

這只是所需的語法:

^通行證陣列100 int通過引用
void Func(int (&myArray)[100]) 

的參數的名稱是myArray;

void Func(int* myArray) 

^傳遞數組。數組衰減到一個指針。因此你失去了尺寸信息。

void Func(int (*myFunc)(double)) 

^傳遞函數指針。該函數返回一個int並採取double。參數名稱是myFunc

+0

我們如何傳遞一個可變大小的數組作爲參考? – 2017-06-29 08:07:50

+0

@ShivamArora您可以對函數進行模板化並將大小設置爲模板參數。 – 2017-06-29 15:53:00

18

它是一種語法。在函數參數int (&myArray)[100]括號&myArray的括號是必要的。如果您不使用它們,那麼您將傳遞array of references,這是因爲subscript operator []的優先級高於& operator

例如int &myArray[100] // array of references

因此,通過使用type construction(),您告訴編譯器您需要引用一個由100個整數組成的數組。

E.g int (&myArray)[100] // reference of an array of 100 ints

+0

「如果你不使用它們,你將會傳遞一個」引用數組「 - 當然,這是不可能存在的,所以你會得到一個編譯錯誤。無論如何,運營商優先規則堅持認爲這肯定會發生,這對我來說很有趣。 – 2016-08-30 15:27:47

+0

是否還有關於類型構造()的更多教程? – Iartist93 2016-12-01 19:32:46

+0

謝謝,我需要一個解釋,其中包括關於運算符優先級的原因,這說明了爲什麼應該這樣做。 – cram2208 2017-11-07 05:43:46

2

數組是違約指針傳遞。您可以嘗試修改函數調用中的數組以便更好地理解。

+1

數組無法按值傳遞。如果函數接收到一個指針,則數組會衰減到指向其第一個元素的指針。我不確定你在這裏想說什麼。 – 2015-07-19 08:50:24

+0

@UlrichEckhardt我想說的是,「數組無法通過值傳遞」,如前所述,它們默認通過引用傳遞 – 2015-07-24 21:52:30

+4

數組既沒有被傳遞,也沒有被傳遞。他們通過指針傳遞。如果數組默認情況下是通過引用傳遞的,那麼使用sizeof就沒有問題了。但事實並非如此。數組傳遞到函數時會衰減指針。 – user3437460 2016-05-27 16:43:36