sizeof--轉載

首先要明確sizeof 不是函數,也不是一元運算符,他是個類似宏定義的特殊關鍵字,sizeof();括號內在編譯過程中是不被編譯的,而是被替代類型,如 int a=8;sizeof(a);在編譯過程中,它不管a的值是什麼,只是被替換成類型 sizeof(int); 結果爲4.如果sizeof(a=6);呢,也是一樣的轉換成a的類型,但是要注意 因爲a=6是不被編譯的,所以執行完sizeof(a=6);a的值還是8,是不變的!

記住以下幾個結論:
1.unsigned影響的只是最高位bit的意義(正負),數據長度不會被改變的。所以sizeof(unsigned int) == sizeof(int);
2.自定義類型的sizeof取值等同於它的類型原形。如typedef short WORD;sizeof(short) == sizeof(WORD)。
3.對函數使用sizeof,在編譯階段會被函數返回值的類型取代。如:int f1(){return 0;};
cout<<sizeof(f1())<<endl; // f1()返回值爲int,因此被認爲是int
4.只要是指針,大小就是4。如:cout<<sizeof(string*)<<endl; // 4
5.數組的大小是各維數的乘積*數組元素的大小。如:char a[] = "abcdef";
int b[20] = {3, 4};
char c[2][3] = {"aa", "bb"};
cout<<sizeof(a)<<endl; // 7
cout<<sizeof(b)<<endl; // 20*4
cout<<sizeof(c)<<endl; // 6
數組a的大小在定義時未指定,編譯時給它分配的空間是按照初始化的值確定的,也就是7,包括‘/0’的。
6.字符串的sizeof和strlen,用例子說明:
char a[] = "abcdef";
char b[20] = "abcdef";
string s = "abcdef"; 
cout<<strlen(a)<<endl; // 6,字符串長度
cout<<sizeof(a)<<endl; // 7,字符串容量
cout<<strlen(b)<<endl; // 6,字符串長度
cout<<sizeof(b)<<endl; // 20,字符串容量
cout<<sizeof(s)<<endl; // 16, 這裏不代表字符串的長度,而是string類的大小
cout<<strlen(s)<<endl; // 錯誤!s不是一個字符指針。 
a[1] = '/0';
cout<<strlen(a)<<endl; // 1
cout<<sizeof(a)<<endl; // 7,sizeof是恆定的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章