sizeof and strlen整理
sizeof數組
- 定義
- 語法
- sizeof(對象)
- sizeof(類型)
- sizeof 對象
- sizeof(2);sizeof(2+3.14);
- sizeof()能夠對一個表達式求值,可是它是根據表達式的類型進行求值。
- 至關於sizeof(int);sizeof(double);
- sizeof(function())
- sizeof()能夠對一個函數調用求值,其結果是函數返回類型的大小,記住函數是不會被調用的。
- int function(); sizeof(function());//4
- 返回值類型是沒有肯定的函數,不能調用sizeof;
- void function(); sizeof(function());//error
- void function(); sizeof(function); //error
- sizeof的常量性
- 基本數據類型的sizeof
- 32位和64位機器的最大區別
- 32位機器:指針表明尋址空間, 32位的尋址空間是2^32, 即32個bit,也就是4個字節
- 64位機器,很顯然就是8個字節
- 因此sizeof(指針),32位得4bytes,64位得8bytes,可是其餘的基本數據類型是一致的,如sizeof(int)都是4個字節。
- 數組的sizeof
- 靜態分配的數組
- sizeof是編譯時肯定要處理的對象的真實內存大小(包括字符串的結束符)
- 數組名做爲實參傳遞給函數,那麼對函數的形參會退化爲指針
- int function(int a[],int* b, char c[],char* d)
- sizeof(a)、sizeof(b)、sizeof(c)、sizeof(d)都是指針的大小,4bytes
- 動態分配的數組
- 很顯然,動態分配的數組在編譯時是沒法知道數組的大小
- n待輸入;int* a=new int[n];sizeof(a); //4
- 因此對於動態分配的數組sizeof將轉換爲對指針的sizeof
- 指針--該指針指向字符數組
- char *a = "12345"; sizeof(a); //4
- 上述和char b[] = "12345"仍是有區別的,sizeof(b) //6
- 結構體的sizeof
- sizeof求得的結構體(及其對象)的大小並不等於各個數據成員對象的大小之和!
- 結構體的大小等於結構體內最大成員大小的整數倍
- 結構體內的成員的首地址相對於結構體首地址的偏移量是其類型大小的整數倍
- 爲了知足規則1和2編譯器會在結構體成員以後進行字節填充!
struct A{函數
int num1;spa
int num2;3d
double num3;指針
};對象
sizeof(A)//16
struct B{內存
int num1;字符串
double num3;編譯器
int num2;it
};
sizeof(B) //24
strlen
- 定義
- 返回字符串的長度。
- 從字符串的第一個字符開始遍歷,直到遇到結束符NULL。返回的長度不包括NULL。
- 運行時計算長度,這個sizeof恰好相反
- 靜態字符數組
- char a[] = "123";strlen(a);//3,遇到NULL中止,不包括NULL
- char a[] = "";strlen(a);//0,不包括NULL
- char a[20] = "123";strlen(a);//3
- char* a= "123";strlen(a);//3
- 動態字符數組
- char *a = new char[20];strlen(a);//27
- 上述並不知道NULL的結尾,因此獲得的長度每次運行都不同。
歡迎關注本站公眾號,獲取更多信息