標籤:

C++中使用模板獲取數組長度時,數組名前的那個&是什麼意思呢?

我想在函數裡面獲取數組的長度,類似這樣

template&
void func(int A[N]){
cout &<&< N &<&< endl; }

但是這樣寫會報錯,我寫成下面這個樣子之後就可以用了

template&
void func2(int (A)[N]){
cout &<&< N &<&< endl; }

我的疑問是這裡的 "",是代表什麼呢?懇請各位大大解答下疑惑。

我使用的是VS2013。


這一個問題和前段時間一位朋友私信問我的問題很像,只是他的問題是模板如何區分出指針和數組。所以,其實這裡的關鍵是如何防止數組被轉化為指針。

而這裡的int (A) [N]其實就是防止arr(假如有個名叫arr的int數組)作為參數傳遞時被轉為int*,因為數組是不能值傳遞的,於是以引用的方式就改變了值傳遞的特點,變為引用傳遞,也就不會轉為int*了。


剛才試了一下,前一種寫法,顯式實例化函數是沒有問題的:

int a[3] = { 1, 2, 3 };

func&<4&>(a);

但是如果隱式實例化的話,就出錯了

func(a);

而第二種寫法,隱式實例化正常。


int (A)[N]

表示對 int[N]數組的引用。

int (*A)[N]同理。


數組引用,防止退化為指針。

sizeof(A) / sizeof(A[0])就可以取數組長度,殺雞焉用牛刀。


數組只有在 sizeof,取地址,和引用的時候不會退化成指針


數組的值傳遞,傳過來就是指針了,

引用傳遞才能保持數組狀態,


推薦閱讀:

c++ ,如何按照不同的要求調用標準庫sort函數排序?
路徑追蹤中菲涅爾反射錯誤的問題?
用一年時間如何能掌握 C++ ?
給定一個長度為n的數列,將這個數列按從小到大的順序排列。1<=n<=200。怎麼寫出程序?
既然 C++ 是 C 的超集,為什麼還是有不少人認為 C++ 不如 C?

TAG:C |