c語言中sizeof詳解
解析C語言中的sizeof
一、sizeof的概念
sizeof是C語言的一種單目操作符,如C語言的其他操作符++、--等。它並不是函式。sizeof操作符以位元組形式給出了其運算元的儲存大小。運算元可以是一個表示式或括在括號內的型別名。運算元的儲存大小由運算元的型別決定。
二、sizeof的使用方法
1、用於資料型別
sizeof使用形式:sizeof(type)
資料型別必須用括號括住。如sizeof(int)。
2、用於變數
sizeof使用形式:sizeof(var_name)或sizeof var_name
變數名可以不用括號括住。如sizeof (var_name),sizeof var_name等都是正確形式。帶括號的用法更普遍,大多數程式設計師採用這種形式。
注意:sizeof操作符不能用於函式型別,不完全型別或位欄位。不完全型別指具有未知儲存大小的資料型別,如未知儲存大小的陣列型別、未知內容的結構或聯合型別、void型別等。
如sizeof(max)若此時變數max定義為int max(),sizeof(char_v) 若此時char_v定義為char char_v [MAX]且MAX未知,sizeof(void)都不是正確形式。
三、sizeof的結果
sizeof操作符的結果型別是size_t,它在標頭檔案中typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。
1、若運算元具有型別char、unsigned char或signed char,其結果等於1。
ANSI C正式規定字元型別為1位元組。
2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double型別的sizeof 在ANSI C中沒有具體規定,大小依賴於實現,一般可能分別為2、2、2、2、4、4、4、8、10。
3、當運算元是指標時,sizeof依賴於編譯器。例如Microsoft C/C++7.0中,near類指標位元組數為2,far、huge類指標位元組數為4。一般Unix的指標位元組數為4。
4、當運算元具有陣列型別時,其結果是陣列的總位元組數。
5、聯合型別運算元的sizeof是其最大位元組成員的位元組數。結構型別運算元的sizeof是這種型別物件的總位元組數,包括任何墊補在內。
讓我們看如下結構:
struct {char b; double x;} a;
在某些機器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。
這是因為編譯器在考慮對齊問題時,在結構中插入空位以控制各成員物件的地址對齊。如double型別的結構成員x要放在被4整除的地址。
6、如果運算元是函式中的陣列形參或函式型別的形參,sizeof給出其指標的大小。
四、sizeof與其他操作符的關係
sizeof的優先順序為2級,比/、%等3級運算子優先順序高。它可以與其他操作符一起組成表示式。如i*sizeof(int);其中i為int型別變數。
五、sizeof的主要用途
1、sizeof操作符的一個主要用途是與儲存分配和I/O系統那樣的例程進行通訊。例如:
void *malloc(size_t size),
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。
2、sizeof的另一個的主要用途是計算陣列中元素的個數。例如:
void * memset(void * s,int c,sizeof(s))。
六、建議
由於運算元的位元組數在實現時可能出現變化,建議在涉及到運算元位元組大小時用sizeof來代替常量計算。
想想看指標的實質是什麼?用來定址定位資料的,32位cpu中地址是32位的,所以指標必然是32位的。
看以下程式的執行結果:
#include <iostream>
using namespace std;
void main()
{
double a[4]={0};
double *b=new double[4];
cout << "sizeof(a)=" << sizeof(a) << endl;
cout << "sizeof(a)/sizeof(a[0])=" << sizeof(a) / sizeof(a[0]) << endl;
cout << "sizeof(b)=" << sizeof(b) << endl;
cout << "sizeof(*b)=" << sizeof(*b) << endl;
delete [] b;
}
結果:
sizeof(a)=32 // 這是整個陣列佔記憶體的大小 sizeof(陣列名)好像是個特例,取整個陣列長度
sizeof(a)/sizeof(a[0])=4 // 用整個陣列佔記憶體的大小 除以 每個元素佔記憶體的大小 便得到陣列的元素個數
sizeof(b)=4 // 這個是指標型別的大小 指標都是4
sizeof(*b)=8 // 這個是指標所指向的一個double型的記憶體塊的大小
簡述:都說陣列和指標具有等價性,[] = malloc(new) + *,但實質上還是略有一點不同的.C/C++明確知道整個陣列佔記憶體的大小(在宣告的時候[]中的引數算是陣列型別的一部分),卻不知道指標所指向的,用malloc(new)申請的整塊記憶體的大小.所以sizeof(*b)得到的只會是一個double型的記憶體塊的大小,卻不是b所指向的整個記憶體塊的大小.
最後再補一句吧 : 此乃個人理解. 因為有人說我星星太多, 話錯話, 誤導大眾.哎..
相關文章
- 解析C語言中的sizeofC語言
- 解析C語言中的sizeof (轉)C語言
- C語言 sizeof函式詳解C語言函式
- C語言中的strlen與sizeof的區別C語言
- C 語言中的 sscanf 詳解
- C語言中static關鍵字詳解C語言
- C語言中的getchar和putchar詳解C語言
- C 語言中 void* 詳解及應用介紹
- C語言中的static 詳細分析C語言
- C語言中sync()C語言
- C語言中有C語言
- 詳細解讀go語言中的chnanelGoNaN
- C語言sizeof()變數、字元、字串C語言變數字元字串
- c語言陣列、sizeof()及strlen()C語言陣列
- C語言中的#和##C語言
- 詳解 Go 語言中 20 個佔位符!Go
- 【Golang詳解】go語言中併發安全和鎖Golang
- C語言中extern的用法C語言
- c語言中的&的用法C語言
- C語言中&&,||,&,| 的區別C語言
- C語言中malloc與freeC語言
- 【C】 30_C語言中的字串C語言字串
- c++ sizeof使用C++
- C 語言中的 time 函式函式
- C語言中結構體感悟C語言結構體
- c語言中的關鍵字C語言
- C語言中的檔案流C語言
- C語言中的*和&符號C語言符號
- C語言中如何寫斷言C語言
- C語言中的abort函式C語言函式
- static在C語言中的作用C語言
- 你正真瞭解C語言中的指標嗎C語言指標
- C語言中,當計算字元陣列長度時,用sizeof 和strlen 的原理及兩者的區別C語言字元陣列
- C語言 printf詳解C語言
- C語言#define詳解C語言
- C語言_瞭解一下C語言中的四種儲存類別C語言
- C語言中幾種報錯型別的解決方案C語言型別
- 詳細對比C語言中的chmod()函式和fchmod()函式C語言函式