[英]Why does sizeof(argv)/sizeof(argv[0]) give me the size of an array in C++?
如果我在main中有一個數組作為參數
int main(int argc, char* argv[])
為什么會
sizeof(argv)/sizeof(argv[0])
總能可靠地給我陣列的長度?
它沒有。
在寫這個答案時,我可能會有點失望; 對於一個相當簡單的問題,語言 - 律師方法太過分了。 我將添加這個快速摘要,足以回答這個問題。 答案的迂腐和過於冗長的版本低於水平線。
鑒於:
int main(int argc, char* argv[])
argv
根本不是一個數組; 它是一個指針。 (C和C ++不允許數組類型的參數;看起來像數組參數的東西實際上是一個指針參數。) argv
確實指向(在運行時)數組的第一個元素,但聲明中沒有信息這個數組有多大。 這就是我們需要argc
參數來提供該信息的原因。
因此sizeof(argv)/sizeof(argv[0])
不會給出數組中元素的數量; 它只是將指針的大小除以指針的大小,這可能會給你1
。 (為什么只有“可能”?這是下面過於迂腐的答案的一部分。)
現在,如果您將某些內容顯式定義為數組對象:
int an_array[42];
你可以用這個成語來計算數組中元素的數量:
sizeof an_array / sizeof an_array[0]
這產生42
,即陣列中元素的數量。 它的工作方式(我認為)非常簡單:它是整個數組的字節大小除以其中一個元素的字節大小。
但它僅適用於一個實際的陣列,而不是像argv
, 看起來像一個數組,但確實是一個指針。
數組和指針之間的關系可能令人困惑。 comp.lang.c FAQ的第6節很好地解釋了它,大部分或全部適用於C和C ++。
現在是冗長的迂腐解釋,有太多的離題:
argv
是一個指針,特別是指向char
指針。 作為參數聲明( 僅在該上下文中), char *argv[]
等同於char **argv
。
sizeof (argv)
是char**
指針中的字節數。
sizeof (argv[0])
是char*
指針中的字節數。
sizeof (argv) / sizeof (argv[0])
很可能是1(假設char*
和char**
具有相同的大小,它們在大多數實現中都是這樣做的)。
現在對於被定義為數組對象的東西:
some_type an_array[COUNT];
表達確實有效; 這個:
sizeof an_array / sizeof an_array[0]
確實為你提供了an_array
中元素的an_array
,即COUNT
。 我認為,原因應該是相當明顯的。 數組中的字節數是數組的一個元素中的字節數乘以元素數。 所以:
sizeof an_array == sizeof an_array[0] * COUNT
並重新安排條款:
sizeof an_array / sizeof an_array[0] == COUNT
順便說一句, sizeof an_array[0]
也可以寫成sizeof *an_array
,因為索引運算符在C中定義的方式。
(請注意,如果該參數是一個表達式,如對象名,則sizeof
運算符不需要括號括起來。如果sizeof
的操作數是表達式或帶括號的類型名稱。但是如果您更喜歡始終使用括號sizeof
,你可以這樣做。)
這是計算數組中元素數量的常用習慣用法 - 但只有當您擁有數組本身的名稱而不是指向其第一個元素的指針時,它才有效。
[以下適用於C.我相信它也適用於C ++(我最初沒有注意到問題標記為C ++,而不是C)。]
在回答注釋中提出的問題時,不, char*
和char**
不需要具有相同的大小。 C標准對指針表示的要求是:
指向void的指針應具有與指向字符類型的指針相同的表示和對齊要求。 同樣,指向兼容類型的限定或非限定版本的指針應具有相同的表示和對齊要求。 所有指向結構類型的指針都應具有相同的表示和對齊要求。 所有指向union類型的指針都應具有相同的表示和對齊要求。 指向其他類型的指針不需要具有相同的表示或對齊要求。
參考: N1570 ,6.2.5p28。
C ++標准至少有一部分內容; N3485草案第3.9.2節[basic.compound]說:
cv
void*
類型的對象應具有與cvchar*
相同的表示和對齊要求。
我沒有找到我從C標准中引用的其余部分的相應文本。
在字尋址機器上, char*
指針可能需要更多信息來指定該字內的字和字節,而不是char**
指針所需要的,只需要指定一個對齊的字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.