天天看點

C語言sizeof是關鍵字還是函數?

sizeof是關鍵字不是函數,就算不知道它是否為32 個關鍵字之一時,我們也可以借助編譯器确定它的身份。來看看下面幾種情況:

A),sizeof(int); B),sizeof(i); C),sizeof int; D),sizeof i;      

32位系統下:

首先很明顯A、B都是4.      

我們用Visual C++6.0或者其他編譯器來試下:

C報錯syntax error : ‘type’      
但是D輸出結果也是4.      

sizeof後面沒有括号也是可以的,但是函數後面是不能沒有括号的,是以sizeof絕不是函數。

不是說sizeof 是個關鍵字,其後面的括号可以沒有麼?那你想想sizeof int 表示什麼啊?int 前面加一個關鍵字?類型擴充?明顯不正确,我們可以在int 前加unsigned,const 等關鍵字但不能加sizeof。好,記住:sizeof 在計算變量所占空間大小時,括号可以省略,而計算類型(模子)大小時不能省略。一般情況下,咱也别偷這個懶,乖乖的寫上括号,繼續裝作一個“函數”,做一個“披着函數皮的關鍵字”。

接下來我們來看看下面這幾個表達式的值:(32位系統下)

int *p = NULL;   //這裡不要寫成Null,或者null

sizeof(p)是多少?

sizeof(*p)是多少?

解答:

sizeof(p)表示的是指針本身所占空間大小,32位下為4.
sizeof(*p)表示的是指針所指資料類型所占的大小,整型,也為4.      

int   a[100];

sizeof(a)、sizeof(a[100])、sizeof(&a)、sizeof(&a[0])的值分别是多少?      

解答:

首先sizeof(a)很明顯是整個數組的大小,是以是400      
sizeof(a[100]) 為4,a[100]是表示第100個元素的下一個元素,使用sizeof(a[100])不會出錯的原因是sizeof 是關鍵字不是函數。函數求值是在運作的時候,而關鍵字sizeof求值是在編譯的時候。雖然并不存在a[100] 這個元素,但是這裡也并沒有去真正通路a[100], 而是僅僅根據數組元素的類型來确定其值。      
sizeof(&a)為4,表示存儲位址空間大小,在Visual C++6.0下輸出為400,可能編譯器把a和&a等同起來了,雖然他們的值是一樣的,但是意義不一樣。      
sizeof(&a[0]) 取第一個元素的位址,也是4      

int b [ 100 ] ;

void fun ( int b [ 100 ] )

{

sizeof (b ) ; // sizeof (b) 的值是多少?

}

解答:

還是為4,其實數組作為參數時,int b[100]和int b[]沒差別,也就相當于int *b 。是以sizeof(b) 就是指針的大小。      

分享到: 0

用微信 OR 支付寶 掃描二維碼 為本文作者 打個賞

C語言sizeof是關鍵字還是函數?
C語言sizeof是關鍵字還是函數?

金額随意 快來“打”我呀~

本文連結:  http://www.bcoder.cn/?p=1435

轉載請注明來源: bcoder程式設計學習網 《C語言sizeof是關鍵字還是函數?》

繼續閱讀