sizeof()
sizeof 在是用來判斷資料類型或者表達式的長度符,(注意:它和strlen不一樣它隻是一個操作符,而strlen()為一個函數)
MSDN上的解釋為:
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type(including aggregate types). This keyword returns a value of type size_t.
文法形式:
sizeof(object);//sizeof(對象)
sizeof(type_name);//sizeof(類型)
是以,
int i;
sizeof( i ); // ok
sizeof( int ); // ok
strlen()
strlen() 是計算字元串的實際長度的函數
頭檔案 : string.h
格式 :strlen (字元數組名)
功能 :計算字元串s的(unsigned int型)長度,不包括’\0’在内
說明 :傳回s的長度,不包括結束符NULL
sizeof和strlen的差別
strlen(char*)函數求的是字元串的實際長度,它求得方法是從開始到遇到第一個’\0’,如果你隻定義沒有給它賦初值,這個結果是不定的,它會從aa首位址一直找下去,直到遇到’\0’停止。
而sizeof()傳回的是變量聲明後所占的記憶體數,不是實際長度,此外sizeof不是函數,僅僅是一個操作符,strlen是函數。
⒈sizeof操作符的結果類型是size_t,它在頭檔案中typedef為unsigned int類型。
該類型保證能容納實作所建立的最大對象的位元組大小。
⒉sizeof是操作符(關鍵字),strlen是函數。
⒊sizeof可以用類型做參數,strlen隻能用char*做參數,且必須是以”\0”結尾的。
⒋數組做sizeof的參數不退化,傳遞給strlen就退化為指針了。
⒌大部分編譯程式 在編譯的時候就把sizeof計算過了是類型或是變量的長度這就是sizeof(x)可以用來定義數組維數的原因
char str[20]=”0123456789”;
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
6.strlen的結果要在運作的時候才能計算出來,是用來計算字元串的長度,不是類型占記憶體的大小。
7.sizeof後如果是類型必須加括弧,如果是變量名可以不加括弧。這是因為sizeof是個操作符不是個函數。
⒏當适用了于一個結構類型時或變量, sizeof 傳回實際的大小,
當适用一靜态地空間數組, sizeof 歸還全部數組的尺寸。
sizeof 操作符不能傳回動态地被分派了的數組或外部的數組的尺寸
⒐數組作為參數傳給函數時傳的是指針而不是數組,傳遞的是數組的首位址,
如:
fun(char [8])
fun(char [])
都等價于 fun(char *)
數組的運算
接下來我們用sizeof進行數組運算(//後為運作結果)
需要知道的是隻有這兩種情況數組名才代表整個數組
int arr[5]={0};
1、sizeof直接加數組名sizeof(arr);
2、&數組名 &arr
代碼1:char arr[] = {‘a’,’b’,’c’,’d’,’e’,’f’};(char類型1個位元組大小)
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));//6 整個數組大小
printf("%d\n", sizeof(arr+));//4 第一個元素的位址
printf("%d\n", sizeof(*arr));//1 第一個元素大小
printf("%d\n", sizeof(arr[]));//1 第二個元素大小
printf("%d\n", sizeof(&arr));//4 數組的位址大小
printf("%d\n", sizeof(&arr+));//4 整個數組之後下一個空間的位址+1是偏移了一個數組的大小即f之後,但它仍是個指針,指針的大小永遠為4
printf("%d\n", sizeof(&arr[]+));//4 第一個元素的位址
代碼2:char arr[] = “abcdef”;
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//7 整個字元串大小 多了\0
printf("%d\n", sizeof(arr+));// 4第一個元素a的位址大小
printf("%d\n", sizeof(*arr));//1第一個元素大小
printf("%d\n", sizeof(arr[]));// 1第二個元素大小
printf("%d\n", sizeof(&arr));// 4整個字元串位址的大小
printf("%d\n", sizeof(&arr+));// 整個字元串之後下一個空間的位址,+1是偏移了一個字元串的大小即f之後,但它仍是個指針,指針的大小永遠為4
printf("%d\n", sizeof(&arr[]+));// 4第二個元素b位址的大小
代碼3:int a[] = { 1, 2, 3, 4 };(int類型4個位元組大小)
int a[] = { , , , };
printf("%d\n", sizeof(a + ));//4第一個元素位址的大小
printf("%d\n", sizeof(*a));//4 第一個元素的大小
printf("%d\n", sizeof(a + ));//4 第二個元素位址大小
printf("%d\n", sizeof(a[]));//4 第二個元素大小
printf("%d\n", sizeof(&a));//4 整個數組位址大小
printf("%d\n", sizeof(*&a));//16 整個數組大小
printf("%d\n", sizeof(&a + ));//4 整個數組之後下一個空間的位址+1是偏移了一個數組的大小即4之後,但它仍是個指針,指針的大小永遠為4
printf("%d\n", sizeof(&a[]));//4 第一個元素位址的大小
printf("%d\n", sizeof(&a[] + ));//4 第二個元素位址的大小
代碼4:char *p = “abcdef”;
char *p = "abcdef";
printf("%d\n", sizeof(p));//4 整個字元串位址大小
printf("%d\n", sizeof(p+));//4 第二個元素位址的大小
printf("%d\n", sizeof(*p));//1 第一個元素a大小
printf("%d\n", sizeof(p[]));//1第一個元素a大小
printf("%d\n", sizeof(&p));//4 第一個元素位址的大小
printf("%d\n", sizeof(&p+));//4 整個字元串之後下一個空間的位址,+1是偏移了一個字元串的大小即f之後,但它仍是個指針,指針的大小永遠為4
printf("%d\n", sizeof(&p[]+));//4 第二個元素大小
接下來我們用strlen進行數組運算(//後為運作結果)
代碼1:char *p = “abcdef”;
char *p = "abcdef";
printf("%d\n", strlen(p));//6 整個字元串長度 不包括\0
printf("%d\n", strlen(p+));//5 第二個元素開始字元串長度
printf("%d\n", strlen(*p));//err *p是一個具體的值 系統崩潰
printf("%d\n", strlen(p[]));//err 同上
printf("%d\n", strlen(&p));//x 随機值 p位址(用二級指針來存放p的位址,也就是位址的位址)之後不知何時遇到\0停止
printf("%d\n", strlen(&p+));//x p位址之後的空間不知何時遇到\0停止
printf("%d\n", strlen(&p[]+));//5 第二個元素開始字元串長度
代碼2:char arr[] = {‘a’,’b’,’c’,’d’,’e’,’f’};
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));//x 随機值 不知何時有\0停止
printf("%d\n", strlen(arr+));//x 同上
printf("%d\n", strlen(*arr));//err *arr是一個值 系統崩潰
printf("%d\n", strlen(arr[]));//err同上
printf("%d\n", strlen(&arr));//x
printf("%d\n", strlen(&arr+));//x
printf("%d\n", strlen(&arr[]+));//x
代碼3:char arr[] = “abcdef”;
char arr[] = "abcdef";
printf("%d\n", strlen(arr));// 6 整個字元串長度不包括\0
printf("%d\n", strlen(arr+));// 6 整個字元串長的
printf("%d\n", strlen(*arr));// err 崩潰
printf("%d\n", strlen(arr[]));//err 崩潰
printf("%d\n", strlen(&arr));// 6 字元串長度
printf("%d\n", strlen(&arr+));//x 随機值偏移了整個數組大小 不知何時遇到\0停止
printf("%d\n", strlen(&arr[]+));// 5 第二個元素開始字元串長度