C語言中如何求任意一個int型數組的長度?

 當你定義一個數組的時候: 數組

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函數

相關文章
相關標籤/搜索