在上節内容中,我們使用符号常量解決了數組元素個數可維護性的額外負擔。然而數組有一種不指定元素個數的形态,通常是用于有固定元素個數的數據,這種情況下很少為其單獨定義符号常量。如果要用循環遍曆數組或非要為其定義符号常量,那可以通過數數的方式來進行。
假定你采取了數數的方式,一旦增加或減少數組元素個數,與該數組有關的流程就存在發生BUG的可能性。很明顯這可以采用更合理的方式解決,這便是sizeof。
sizeof運算符在C語言中,一個char類型的變量占用一個字節的存儲空間,那int類型與float類型呢?這可以通過使用sizeof運算符來測量。
使用sizeof運算符時,需要提供變量或類型參數(如果是表達式,則按表達式結果的類型計算),返回該變量或類型以byte為單位所占用的空間大小。
這裡有兩點需要注意:
因此測試一個int類型變量的大小與測試int類型自身得到的結果是一緻的,這裡的程序顯示了在32位環境下,我們學習的已知變量類型的大小。
測試數組
關于sizeof需要牢記的便是:不管傳遞給sizeof是的變量還是類型,最終計算的是類型占據的大小。因此我們将一個數組對象傳遞給sizeof運算符,它便會計算出整個數組元素所占用的字節數。
根據第一個程序的結果我們知道sizeof(int)=4,那麼這裡sizeof(a)=4(字節)*9(元素)=36個字節。同樣sizeof(c)=8。知道了數組對象的總大小,除以元素的類型,便是數組元素的個數,下面是程序運行結果。
需要注意在計算數組a的元素個數時,我們采用的表達式為:sizeof(a)/sizeof(int);而數組c則采用的是傳遞變量的形式sizeof(c)/sizeof(c[0])。使用第二種方式的優勢在于,當你改變數組類型時,則不必改變求值表達式。假設采用方式一,你現在将數組a由int型改為float型,那表達式需要相應的更改為:sizeof(a)/sizeof(float)。
搶答送分題
思考一下:在表達式sizeof(c)/sizeof(c[0])中,為什麼使用數組的第一個元素,而不是其它元素,使用其它元素行嗎?
隻要你使用的元素沒有越界,那麼使用數組哪個元素都是可行的。之所以使用0号元素,因為數組也存在隻有一個元素的情況,如果你使用sizeof(c[1]),就會在不經意間造成越界訪問。之所以能夠使用任何一個未越界的元素,另一個深層的原因是:數組是存放同一類型數據的集合,這在數組的特性中提到過,并且sizeof最終計算的是類型占據的大小,sizeof(c[0])與sizeof(c[5])都是測試sizeof(char)類型占用的空間。
确認數組類型再次重申一下,不管傳遞給sizeof是的變量還是類型,最終計算的是類型占據的大小。
以測試數組中的例子而言,sizeof遇到a之後,它知道a是一個含有9個int型數據的數組,c則是一個含有8個字符的char型數組。sizeof(a)事實上相當于測試sizeof(int[9]),sizeof(c)就是sizeof(char[8]),所以a的類型是int[9], c的類型是char[9]。你可以把下列代碼加入到程序中,會發現這兩種類型占用的存儲空間與我們程序表述的一緻。
當然,如果使用C ,我們可以很輕松的看到數據的真實類型。下列程序使用typeid取得變量的類型對象,并打印出類型名稱。
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!