知識點習題
sizeof(…)是運算子,它的結果型別是size_t(在標頭檔案中typedef為unsigned int型別),其值在編譯時即計算好了,引數可以是陣列、指標、型別、物件、函式等。
功能:獲得能容納實現所建立的最大物件的位元組大小。
由於在編譯時計算,因此sizeof不能用來返回動態分配的記憶體空間的大小。實際上,用sizeof來返回型別以及靜態分配的物件、結構或陣列所佔的空間,返回值跟物件、結構、陣列所儲存的內容沒有關係。
具體而言,當引數分別如下時,sizeof返回的值表示的含義如下:
strlen是函式,要在執行時才能計算。引數必須是字元型指標。當陣列名作為引數傳入時,實際上陣列就退化成指標了。
功能:返回字串的長度。
該字串可能是自己定義的,也可能是記憶體中隨機的,該函式實際完成的功能是從代表該字串的第乙個位址開始遍歷,直到遇到結束符null(』\0』)。返回的長度大小不包括』\0』!
舉例:
輸出結果為:15 and 4char arr[15]
="wang\0miao"
;int len_one =
sizeof
(arr)
;int len_two =
strlen
(arr)
; cout << len_one <<
" and "
<< len_two << endl;
點評:sizeof返回定義arr陣列時,編譯器為其分配的陣列空間大小,不關心裡面存了多少資料。strlen只關心儲存的資料內容,不關心空間的大小和型別。
輸出結果:23 and 4 and 1char
* parr =
newchar[10
];int len_one =
strlen
(parr)
;int len_two =
sizeof
(parr)
;int len_three =
sizeof
(*parr)
;cout << len_one <<
" and "
<< len_two <<
" and "
<< len_three << endl;
點評:
輸出結果:4 5void
func
(char str_arg[2]
)int
main
(void
)
點評:
sizeof是乙個操作符,而strlen是庫函式。
sizeof的引數可以是資料的型別,也可以是變數,而strlen只能以結尾為』\0』的字串作引數。
編譯器在編譯時就計算出了sizeof的結果,而strlen必須在執行時才能計算出來。
sizeof計算資料型別佔記憶體的大小,strlen計算字串實際長度。
陣列做sizeof的引數不退化,傳遞給strlen就退化為指標了。
sizeof後如果是型別必須加括弧,如果是變數名可以不加括弧。這是因為sizeof是個操作符不是個函式。
下面關於strlen與sizeof的說法,正確的是()
a. sizeof 函式在程式執行階段執行
b. strlen 函式在程式執行階段執行
c. sizeof 的引數不可以是常量
d. strlen 函式的結果和位元組對齊有關係
正確答案:b
sizeof與strlen用法詳解 結構體對齊
includeint main int argc,char argv unsigned char a1 10 char p hello world printf sizeof p d n sizeof p printf strlen p d n strlen p printf sizeof a d ...
sizeof與strlen用法詳解 結構體對齊
include stdio.h int main int argc,char argv unsigned char a1 10 char p hello world printf sizeof p d n sizeof p printf strlen p d n strlen p printf si...
sizeof和strlen區別詳解
sizeof是運算子 當引數分別如下時,sizeof返回的值含義如下 陣列 編譯時分配的陣列空間大小 指標 儲存該指標所用的空間大小 型別 該型別所佔的空間的大小 物件 物件的實際占用空間大小 函式 函式返回型別所佔空間的大小 strlen 是函式,可以計算字串的長度,直到遇到結束符null才結束,...