變量與存儲

c語言中包含char、int、float、double等基本數據類型,本節主要研究一下這些基本數據類型的特點及存儲。

1、要用到的東西

a、sizeof函數,stdio.h中的函數,該函數接受一個變量,輸出該變量的大小,單位為byte;
b、存儲地址輸出,用到&操作符,“&變量名”表示該變量的地址。

2、直接開始

廢話不多說,直接上程序:

char a;  
int b;  
float c;  
double d;  
  
printf("a的地址為: %p [char]   [%d Byte] \n",&a,(int)sizeof(a));  
printf("b的地址為: %p [int]    [%d Byte] \n",&b,(int)sizeof(b));  
printf("c的地址為: %p [float]  [%d Byte] \n",&c,(int)sizeof(c));  
printf("d的地址為: %p [double] [%d Byte] \n",&d,(int)sizeof(d)); 

該程序段通過地址操作及sizeof函數,分別算出char、int、float、double類型變量的地址和大小,注意這4個變量是按順序創建的,我們看看輸出結果:

a的地址為: 0x7fff5fbff8db [char]   [1 Byte]   
b的地址為: 0x7fff5fbff8d4 [int]    [4 Byte]   
c的地址為: 0x7fff5fbff8d0 [float]  [4 Byte]   
d的地址為: 0x7fff5fbff8c8 [double] [8 Byte]  

從輸出結果可以看出各數據類型分別占用的空間:
char類型:1字節;
int類型:4字節
float類型:4字節
double類型:8字節
從地址方面來分析:
按照a、b、c、d創建的順序可以發現,地址是按照從大到小的順序來存儲的,而如果重新打開程序的話,這些地址會發生變化,但是兩個地址之間的差值不變。進一步分析,可以發現,char類型的數據雖然只有1byte,但是卻占據4byte。
進一步驗證:

char aa;  
char bb;  
int ff;  
printf("char %p \n",&aa);  
printf("char %p \n",&bb);  
printf("int  %p \n",&ff); 

我通過在int類型前面創建兩個char變量,結果又會如何呢?我們推測這兩個char數據也是占有4byte,看看是否正確:

char 0x7fff5fbff8c7   
char 0x7fff5fbff8c6   
int  0x7fff5fbff8c0  

結果是正確的。

3、結論

a、char數據的建立以4byte為單位
b、int/float數據以4byte為單位
c、double數據以8byte為單位

4、注意點

a、本次測試的環境為macbook air 64位,在其他環境下可能略有不同;
b、以上得出的結論并不是完整的推論,只是做簡單的探討,如考慮short等類型數據,char可能占有的就是2字節。
c、sizeof還有其他一些用途、不在本節討論。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 首先感覺本文原作者的分享 w57w57w57的專欄-CSDN博客網址: http://blog.csdn.net/...
    HelloGeekBand閱讀 2,372評論 0 7
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,377評論 0 35
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,002評論 0 7
  • __block和__weak修飾符的區別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,354評論 0 6
  • 天高云淡,大雁南飛,又是一年秋日到。滿世界到處都是桂花的香氣,濃烈,馥郁,盡管桂花花兒不起眼,這香味卻非同凡響。 ...
    向日葵3閱讀 293評論 0 0