簡體   English   中英

為什么衰減到數組參數的指針似乎不適用於sizeof()?

[英]Why does decay to pointer for array argument appear not to apply to sizeof()?

我之前讀過一個因為與此完全重復而被關閉的問題

當函數具有特定大小的數組參數時,為什么它被指針替換?

如何找到'sizeof'(指向數組的指針)?

但讀完之后我仍然對sizeof()的工作原理感到困惑。 我理解將數組作為參數傳遞給函數,如

  void foo(int a[5])

將導致數組參數衰減為指針。 我在上面的2個問題鏈接中找不到的是一個明確的答案,為什么sizeof()函數本身免於(或至少看似豁免)這個指針衰減行為。 如果sizeof()表現得像任何其他函數那么

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

那么上面應該輸出4而不是20 我是否錯過了一些明顯的東西,因為這似乎與指針行為的衰退相矛盾? 很抱歉再次提起這個問題,但我真的很難理解為什么會發生這種情況,盡管多年來一直很愉快地使用這個功能而沒有真正考慮它。

因為標准這樣說(強調我的):

(C99,6.3.2.1p3)“ 除非它是sizeof運算符或一元&運算符的操作數,或者是用於初始化數組的字符串文字,否則類型為”array of type“的表達式將轉換為帶有“指向類型的指針”類型的表達式,它指向數組對象的初始元素,而不是左值。“

請注意,對於C ++,標准明確指出大小是數組的大小:

(C ++ 11,5.3.3p2 sizeof)“[...]當應用於數組時,結果是數組中的總字節數。這意味着n個元素的數組大小是n倍的n倍。元素的大小。“

sizeof是一個運算符,而不是一個函數。 這也是具體的一個。 如果它是一個表達式,則括號甚至不是必需的:

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

如您所見,它也在這個優先級圖表上。 它也是不可重載的運營商之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM