2012-07-01 107 views
7

我由於是完全重複讀取質詢時已關閉該爲什麼decay指向數組參數的指針似乎不適用於sizeof()?

When a function has a specific-size array parameter, why is it replaced with a pointer?

How to find the 'sizeof' (a pointer pointing to an array)?

但看完這個我仍然是如何的sizeof混淆()作品。我知道將一個數組作爲參數傳遞給函數,如

void foo(int a[5]) 

將導致數組參數衰減爲指針。我在上面的兩個問題鏈接中沒有找到的是一個明確的答案,爲什麼sizeof()函數本身免於(或至少看似免除)該指針衰減行爲。如果的sizeof()的表現就像任何其他功能然後

int a[5] = {1,2,3,4,5}; 
    cout << sizeof(a) << endl; 

然後上述應該輸出4代替20。我錯過了一些明顯的東西,因爲這似乎是指針行爲衰退的矛盾嗎?對不起再次提出這個問題,但我真的很難理解爲什麼會發生這種情況,儘管多年來一直很高興地使用這個功能而沒有真正考慮它。

+3

注意:'void foo(int(&a)[5])'不會*導致數組參數衰減。這是重要的目標,而不是來源。 – Xeo

+3

'void foo(int a [5])' - 我真的希望參數表單不會被棄用,只允許使用「void foo(int * a)」形式,它只會導致混淆。我不在乎誰破解了代碼。 –

回答

15

因爲標準是這樣說的(重點煤礦):

(C99,6.3.2.1p3)「除了當它是sizeof操作符或一元&操作員的操作,或者是用於初始化數組的字符串文字,具有類型「數組類型」的表達式將轉換爲類型爲「指向類型的指針」的表達式,該表達式指向數組對象的初始元素並且不是左值。

注意,對於C++,標準明確地說,尺寸是陣列的尺寸:

(C++ 11,5.3.3p2的sizeof)「[...]當施加到一個數組,結果是數組中的字節總數,這意味着元素數組的大小是元素大小的n倍。

+0

Thankyou - 這完美地爲我清除它。 – mathematician1975

+0

在C++中,規則稍有不同,它還有另一種情況,即不會發生衰減:將數組表達式綁定到數組引用時。但這些都是奇怪的事情。另請參閱http:// stackoverflow。COM /問題/ 3368883 /如何 - 做 - 這-大小的陣列模板功能工作 – MSalters

6

sizeof是一個操作符,而不是一個函數。這也是一個特定的問題。括號是不是如果它是一個表達式甚至是必要的:

int a; 
sizeof (int); //needed because `int` is a type 
sizeof a; //optional because `a` is an expression 
sizeof (a); //^ also works 

正如你所看到的,它是這個圖表的precedence上也是如此。它也是不可重載的操作員之一。

相關問題