c語言中sizeof的用法
c語言中sizeof的用法的用法你知道嗎?下面小編就跟你們詳細介紹下c語言中sizeof的用法的用法,希望對你們有用。
c語言中sizeof的用法的用法如下:
sizeof其實就是一個運算子,和那些+,-一樣的東西,在程式編譯的時候進行解析轉換。雖然我們經常見到sizeof後面跟著個小括號,長得和函式差不多,但它和函式完全是兩碼事。
2,有什麼用?
sizeof其實就是用於告訴我們編譯器在為某一特定資料或者某種資料型別的資料在儲存空間中開闢空間時,開闢的空間大小,以位元組為單位。
3,怎麼用?
sizeof(型別),或者sizeof(變數)都可以,得到的就是型別或者變數的儲存空間。當對變數用的時候,也可以沒有括號,直接 sizeof 變數,但一般不用(我一般都是隻記一種通用的用法……)。
4,用的時候要注意什麼?
(1)sizeof返回的佔用空間大小是為這個變數開闢的大小,而不只是它用到的空間。和現今住房的建築面積和實用面積的概念差不多。所以對結構體用的時候,大多情況下就得考慮位元組對齊的問題了。
(2)對位域成員等連編譯器都無法確定儲存空間的東西不能用。這個應該比較好理解,因為sizeof返回的都是以位元組為單位的資料,你讓它去求那些以位為單位的大小,這不是存心難為編譯器嘛。所以編譯器採用的方案是統一不受理,即使你說你剛好是8位,佔一個位元組,編譯器也不理你。
(3)sizeof返回的資料型別是unsigned int。因為C中不同型別資料混合運算時的自動轉換,有時候不注意的話可能會出問題,具體可以參照下面的程式例子。
(4)要注意陣列名和指標變數的區別。通常情況下,我們總覺得陣列名和指標變數差不多,但是在用sizeof的時候差別很大,對陣列名用sizeof返回的是整個陣列的大小,而對指標變數進行操作的時候返回的則是指標變數本身所佔得空間,在32位機的條件下一般都是4。而且當陣列名作為函式引數時,在函式內部,形參也就是個指標,所以不再返回陣列的大小。
5,例項分析
原始碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<stdio.h>
int main()
{
int iVal = 3;
printf("The size of type int is %d n", sizeof(int));
printf("The size of iVal is %dn", sizeof(iVal));
printf("The size of iVal is %dn", sizeof iVal);
if((iVal - sizeof(int)) < 0)
{
printf("The return type is intn");
}
else
{
printf("The return type is unsigned intn");
}
char chArrayCon[7];
char *chp;
chp = chArrayCon;
printf("The size of chArrayCon is %d, The size of chp is %dn", sizeof(chArrayCon), sizeof(chp));
int iArraySize = 3;
char chArrayVar[iArraySize];
printf("The size of chArrayVar is %dn", sizeof(chArrayVar));
return 0;
}
執行結果:
The size of type int is 4
The size of iVal is 4
The size of iVal is 4
The return type is unsigned int
The size of chArrayCon is 7, The size of chp is 4
The size of chArrayVar is 3
結果分析:
程式碼第一部分主要就是簡單的表示了一下用法。
第二部分說明了注意事項的第三項。按說,iVal的值是3,減4的話應該是-1,小於0,輸出的應該是"he return type is int"。但是由於當int和unsigned int一起運算時,會預設變成unsigned int,所以結果會是一個很大的unsigned int型別的數,是大於0的。
程式碼第三部分就簡單說明了陣列名和指標變數的區別,即使你把指標變數指向陣列名,編譯器依然能夠分辨出區別。
以上講述的都沒有考慮在C99標準下的情況。因為在C99標準下有種特殊情況,那就是不定長陣列的使用。當對不定長陣列名使用sizeof的話,返回的也是整個陣列的大小,就像例項中第四塊程式碼一樣。但是這並不是在編譯階段執行的,而是在程式執行階段執行的。因為在編譯的時候,編譯器一般不知道變數的值是多少。(當然例子中我直接賦值3,可能不方便理解,可以假想iArraySize是通過scanf來獲得實際數值的,然後再宣告陣列的)。對於這種情況,實際中應用的並不多,大家可以當做特殊情況對待即可,或者直接忽略掉也行……
6總結
其實sizeof的作用就是告訴我們分配給變數的“建築面積”的大小,只要記得這一點應該就夠了,不管這個變數型別是普通的整型資料,還是結構體,共用體,列舉……記住這一點後,當我們再去想知道sizeof對不同資料型別操作返回的值到底是什麼的時候,只需搞明白那些資料型別到底要消耗多少“建築面積”就可以啦!