2014-10-30 56 views
1

所以平時當你輸入函數參數數組聲明他們是這樣的:這些數組類型有何不同?

f (const float offset [ 3 ]) 

但我一直在努力有他們的項目申報,像這樣:

f (const float (&offset) [ 3 ]) 

那有什麼改變什麼意思?據我所知,我們已經有效地傳遞了一個指針。強制這樣的參考甚至是什麼呢?

+0

牢記數組不是指針和該簽名只是自動的改變爲指針在第一種情況下,因爲它是一個函數參數的變化相當大的。它不再接受指針參數。 – chris 2014-10-30 03:20:34

+0

目前尚不清楚,似乎'f'是一個函數調用,所以'offset'可能是'float **'。添加更多代碼! – gmas80 2014-10-30 03:22:24

回答

3
f (const float offset [ 3 ]) 

在這種情況下,3是無意義的。 offset甚至不是一個數組,它是一個指針(const float*)。所以這個函數將接受任何浮點指針,並且任何大小的浮點數都會被衰減接受。

float x2[2]; 
float x3[3]; 
float x4[4]; 
float* fp; 

f(x2);  // compiles 
f(x3);  // compiles 
f(x4);  // compiles 
f(fp);  // compiles 

此外,在該函數內:

sizeof(offset) == sizeof(float*) 

然而,

f (const float (&offset) [ 3 ]) 

在這種情況下,offset是3常量漂浮數組的引用。只有3個花車陣列纔會被接受爲參數。

f(x2);  // does not compile 
f(x3);  // compiles 
f(x4);  // does not compile 
f(fp);  // does not compile 

而且裏面的功能:

sizeof(offset) == sizeof(float) * 3 
+0

我的下一個問題是爲什麼括號是必需的?如果我不在MSVC2010中使用它們,則會出現錯誤,指出不允許引用數組。這只是MSVC的一個怪癖,或者類型符號的優先級是如何工作的? – BlamKiwi 2014-10-30 03:33:52

+0

@MorphingDragon:哪個括號?括號?是的,它們是必要的,這正是編譯器告訴你的原因。沒有它們,編譯器會認爲你正在試圖聲明一個引用數組(而不是對數組的引用),這是不允許的。 – 2014-10-30 03:40:44