sizeof 是判斷數據類型長度符(字節數)的關鍵字。是一個操作符不是函數。
sizeof的用法:
sizeof(類型說明符,數組名或表達式);
或sizeof 變量名
sizeof定義
sizeof是C/C++中的一個操作符(operator),簡單的說其作用就是返回一個對象或者類型所佔的內存字節數。
char
*pc=
"abc"
;
int
*pi;
string
*ps;
char
**ppc=&pc;
void
(*pf)();
//函數指針
sizeof
(pc);
//結果爲4
sizeof
(pi);
//結果爲4
sizeof
(ps);
//結果爲4
sizeof
(ppc);
//結果爲4
sizeof
(pf);
//結果爲4
1
2
|
intc1= sizeof (a1)/ sizeof ( char ); //總長度/單個元素的長度 intc2= sizeof (a1)/ sizeof (a1[0]); //總長度/第一個元素的長度 |
1
2
3
4
5
6
7
8
|
voidfoo3(char
a3[3]) { int
c3= sizeof (a3); //c3== } voidfoo4(char
a4[]) { int
c4= sizeof (a4); //c4== } |
1
2
|
shortf(); printf ( "%d\n" , sizeof (f())); |
1
2
3
|
charstr[20]= "0123456789" ; inta= strlen (str); //a=10; intb= sizeof (str); //而b=20; |
1
|
fun( char [8])fun( char []) |
1
2
|
intsum(); printf ( "%d\n" , sizeof (sum())); //輸出的結果是sizeof(int),即4。 |
1
2
3
|
charstr[20]= "0123456789" ; intlen1= strlen (str); //len1=10; intlen2= sizeof (str); //len2=20; |
6.當適用於一個結構類型時或變量, sizeof 返回實際的大小;當適用一靜態地空間數組,sizeof 歸還全部數組的尺寸。
sizeof 操作符不能返回動態地被分派了的數組或外部的數組的尺寸;
7.數組作爲參數傳給函數時傳的是指針而不是數組,傳遞的是數組的首地址,
如:
1
2
|
fun( char [8]) fun( char []) |
在C++裏參數傳遞數組永遠都是傳遞指向數組首元素的指針,編譯器不知道數組的大小,如果想在函數內知道數組的大小, 需要這樣做:
進入函數後用memcpy拷貝出來,長度由另一個形參傳進去
1
2
3
4
5
|
fun(unsigedchar*p1,intlen) { unsignedchar*buf=newunsignedchar[len+1]; memcpy (buf,p1,len); } |
char* str = "abacd";
sizeof(str) //結果 4 --->str是指向字符串常量的字符指針,sizeof 獲得的是一個指針所佔的空間,應該是長整型的,所以是4;
sizeof(*str) //結果 1 --->*str是第一個字符,其實就是字符串的第一位'a' 所佔的內存空間,是char類型的,佔了 1 位;
strlen(str)= 5 //--->若要獲得這個字符串的長度,則一定要使用 strlen
1
2
3
4
5
|
fun(unsigedchar*p1,intlen) { unsignedchar*buf=newunsignedchar[len+1]; memcpy (buf,p1,len); } |
1
|
charstr[20]= "0123456789" ; |
1
2
3
4
|
charArray[3]={ '0' }; sizeof (Array)==3; char *p=Array; strlen (p)==1; //sizeof(p)結果爲4 |
1
|
char *ss= "0123456789" ; |
1
2
3
|
charstr[20]= "0123456789" ; inta= strlen (str); //a=10; intb= sizeof (str); //而b=20; |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
charstr[20]= "0123456789" ; inta= strlen (str); //a=10; intb= sizeof (str); //而b=20; charss[]= "0123456789" ; sizeof (ss)結果11===》ss是數組,計算到\0位置,因此是10+1 sizeof (*ss)結果1===》*ss是第一個字符 charss[100]= "0123456789" ; sizeof (ss)結果是100===》ss表示在內存中的大小100×1 strlen (ss)結果是10===》 strlen 是個函數內部實現是用一個循環計算到\0爲止之前 intss[100]= "0123456789" ; sizeof (ss)結果400===》ss表示在內存中的大小100×4 strlen (ss)錯誤===》 strlen 的參數只能是 char *且必須是以 '\0' 結尾的 charq[]= "abc" ; charp[]= "a\n" ; sizeof (q), sizeof (p), strlen (q), strlen (p); |
1
|
charszPath[MAX_PATH] |
1
|
(voidfun(charszPath[MAX_PATH])) |
1
2
3
4
5
6
7
8
|
charconst*static_string= "Hello" ; //sizeof(static_string)是sizeof一個指針,所以在32bitsystem是4 charstack_string[]= "Hello" ; //sizeof(stack_string)是sizeof一個數組,所以是6*sizeof(char) char *string=newchar[6]; strncpy (string, "Hello" ,6"); //sizeof(string)是sizeof一個指針,所以還是4。 //和第一個不同的是,這個指針指向了動態存儲區而不是靜態存儲區。 |
1
2
3
4
5
6
7
8
9
10
11
|
structtest { inta,b,c,d,e,f,g,h; }; intmain() { test&r=*newtest; cout<< sizeof (test)<<endl; //32 cout<<sizeofr<<endl; //也是32 system ( "PAUSE" ); } |