當你定義一個數組的時候: 數組
int a[] = {1, 2, 3}; // 實際上被編譯爲 int a[3] = {1,2,3}
數組名錶明的是數組的地址。注意 —— 你絕對沒有辦法經過數組名動態得到數組的大小。當你丟失a的長度信息的時候,你永遠不可能知道他的長度。
那麼 sizeof 是怎麼回事呢?他不是經過 a 的名字得到 a的大小了麼? —— 大錯特錯!
關鍵字 sizeof 產生的是一個編譯期常量(注1) 他的運做方式是這樣的:
當你寫:
sizeof a
實質是:
sizeof ( a的類型 )
而a的類型是什麼呢?編譯器察看 a的定義發現, 是 int [3]
就是說,這裏 sizeof a 實質是:
sizeof ( int[3] )
徹底等同於常量 12 (假定int爲4字節)。
考慮一個函數
void func( int a[] );
// 寫成 int a[3] 也不會有本質區別——也許你該試試寫成 int (&a) [3] ?
C++規定,數組做爲形參的時候,a表明數組首地址。
他的底層意義是: a 退化爲了一個4字節的指針,沒有任何變量表示數組的大小會「自動」被傳遞進來。
咱們看看這個時候 sizeof a是什麼:
sizeof( 函數形參的a[] ) = sizeof( int* const ) = 4 // 固然a[]不是合法的C++類型
仍然不服氣?好——咱們反問一個問題:若你是C /C++的設計者, 你怎麼在兼容原有設計的基礎上讓void func( int a[] )同時傳遞地址和大小?
首先,a是一個變量,並且相似數組。他必須是一個地址,不然你不知道如何索引元素。
他怎麼再帶上一個變量表示他的大小呢?
擴充 sizeof (a) 的能力?
sizeof a 必須產生代碼——無論是常量仍是什麼。 要讓他在運行時決定 a的值, a就必須帶上他的大小信息。
1 你必須修改C標準,讓C支持「兩種」數組。一種是定義處的數組,他分配大片連續內存,和原來的C標準相同。
2 另外一種是做爲參數傳遞數組。 你必須傳遞地址和數組大小;這個數組其實是一個8字節的結構{ 地址; 大小}(事實上可能更加複雜,考慮多緯數組如何實現? )
3 系統必須根據兩種不一樣數組分別實現其 []、* 、&等。 原有的數組根據其首地址偏移(這是個常量)和下標尋址; 而參數數組則首先取「地址」內容(這是個變量),而後根據這個地址尋址....
厄... 再考慮多維數組——聽起來這不是一整套vector模型麼?
-----------------------------------------------
注1: 對於C99支持的 flexible array ,其 sizeof 運算是運行時求值ide
轉自:http://blog.csdn.net/georgelife7/article/details/7611252函數