<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    jasmine214--love

    只有當(dāng)你的內(nèi)心總是充滿快樂(lè)、美好的愿望和寧?kù)o時(shí),你才能擁有強(qiáng)壯的體魄和明朗、快樂(lè)或者寧?kù)o的面容。
    posts - 731, comments - 60, trackbacks - 0, articles - 0

    C-sizeof解析

    Posted on 2010-11-29 17:13 幻海藍(lán)夢(mèng) 閱讀(236) 評(píng)論(0)  編輯  收藏 所屬分類: C語(yǔ)言學(xué)習(xí)
    只要參加軟件研發(fā)的筆試(C/C++)幾乎都會(huì)涉及到sizeof()的用法,我昨天也遇到了,有的也會(huì),但是真正sizeof()的核心還是 沒有領(lǐng)會(huì),今天上網(wǎng),無(wú)聊中就看到了詳細(xì)的sizeof()的闡述,現(xiàn)在分享給大家。
    ------------sizeof----------------
    sizeof 一般形式為:sizeof(object),也可以sizeof var_char,不過(guò)大部分programer習(xí)慣用sizeof()。
         對(duì)象可以是表達(dá)式或者數(shù)據(jù)類型名,當(dāng)對(duì)象是表達(dá)式時(shí),括號(hào)可省略。sizeof是單目運(yùn)算符,其運(yùn)算符的含義是:求出對(duì)象在計(jì)算機(jī)內(nèi)存中所占用的字節(jié)數(shù)。 一般來(lái)講,不同的機(jī)器,運(yùn)行不同的對(duì)象是不一樣的,當(dāng)目前幾乎所有的機(jī)器都是32位,很少16位的,所以一般考試都是基于32位的window和 linux的。
    C語(yǔ)言中數(shù)據(jù)類型不多。
    1.整數(shù)型的:
    short,int,long(我沒有考慮符號(hào)問(wèn)題),一般c語(yǔ)言書上講,int是2個(gè)字節(jié)的,即16位,范圍是 -32768-32767,long是4個(gè)字節(jié),范圍是-2^32---2^32-1。當(dāng)時(shí)在xp上運(yùn)行sizeof(int)的時(shí)候,會(huì)output 4.這就是32位的原因。sizeof(long)也是4.
    如下:#include "stdio.h"
    #include "string.h"
    #include "stdlib.h"
    int main()
    {
     short int sa=10;
        int a=10;
        long la=10;
        float f = 20;
        double d=20;
        char ch='c';
        char str[]="ABC";
        char *p=str;
        struct str{
      double d;
      char ch;
      int data;
     }str_wu;
     struct str1{
      char ch;
      double d;
      int data;
     }str_wu1;
        printf("sizeof(short):%d\n",sizeof(sa));
     printf("sizeof(int):%d\n",sizeof(a));
        printf("sizeof(long):%d\n",sizeof(la));
        printf("sizeof(float):%d\n",sizeof(f));
        printf("sizeof(double):%d\n",sizeof(d));
        printf("sizeof(char):%d\n",sizeof(ch));
        printf("sizeof(string):%d\n",sizeof(str));
        printf("sizeof(point address):%d\n",sizeof(p));
        printf("sizeof(Point):%d\n",sizeof(*p));
        printf("sizeof(Struct):%d\n",sizeof(str_wu));
        printf("sizeof(Struct):%d\n",sizeof(str_wu1));
        system("pause");
    }
    650) this.width=650;" onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/200810/200810211224596908046.jpg" border="0">
    因而int,short的sizeof結(jié)果是一樣的額。
    2.浮點(diǎn)型數(shù)據(jù)
    float,double,long double
    上邊的圖,long double 沒有測(cè)試(忘了。。。。。)呵呵!
    但是應(yīng)該是16。
    3。指針
    對(duì)于指針,要特別區(qū)分,指針指向什么數(shù)據(jù),它在內(nèi)存占的字節(jié)數(shù)才是它的結(jié)果。
    比如:指針指向一個(gè)字符串,就是字符串的長(zhǎng)度,因?yàn)橐粋€(gè)字符在內(nèi)存中占一個(gè)字節(jié)。若指針指向一個(gè)數(shù)據(jù)結(jié)構(gòu),則結(jié)果應(yīng)該是結(jié)構(gòu)型數(shù)據(jù)的內(nèi)存字節(jié) 數(shù)。
    4。結(jié)構(gòu)類型
    在上面的程序中,
    struct str{
                              double d;
                             char ch;
                              int data;
     }str_wu;
     struct str1{
                               char ch;
                                double d;
                                 int data;
     }str_wu1;

    兩個(gè)不同的結(jié)構(gòu),但是內(nèi)部的元素是相同的,都是 double,int,char,只是順序不一樣,就結(jié)果不一樣。why?
    這時(shí)因?yàn)閂C存儲(chǔ)數(shù)據(jù)的時(shí)候要對(duì)其,具體的情況如下:
    類型
    對(duì)齊方式(變量存放的起始地址相對(duì)于結(jié)構(gòu)的起始地址的偏移量)
    Char
    偏移量必須為sizeof(char)即1的倍數(shù)
    int
    偏移量必須為sizeof(int)即4的倍數(shù)
    float
    偏移量必須為sizeof(float)即4的倍數(shù)
    double
    偏移量必須為sizeof(double)即8的倍數(shù)
    Short
    偏移量必須為sizeof(short)即2的倍數(shù)
    比如:str_wu,為上面的結(jié)構(gòu)分配空間的時(shí)候,VC根據(jù)成員變量出現(xiàn)的順序和對(duì)齊方式,先為 第一個(gè)成員dda1分配空間,其起始地址跟結(jié)構(gòu)的起始地址相同(剛好偏移量0剛好為sizeof(double)的倍數(shù)),該成員變量占用 sizeof(double)=8個(gè)字節(jié);接下來(lái)為第二個(gè)成員dda分配空間,這時(shí)下一個(gè)可以分配的地址對(duì)于結(jié)構(gòu)的起始地址的偏移量為8,是 sizeof(char)的倍數(shù),所以把dda存放在偏移量為8的地方滿足對(duì)齊方式,該成員變量占用sizeof(char)=1個(gè)字節(jié);接下來(lái)為第三個(gè) 成員type分配空間,這時(shí)下一個(gè)可以分配的地址對(duì)于結(jié)構(gòu)的起始地址的偏移量為9,不是sizeof(int)=4的倍數(shù),為了滿足對(duì)齊方式對(duì)偏移量的約 束問(wèn)題,VC自動(dòng)填充3個(gè)字節(jié)(這三個(gè)字節(jié)沒有放什么東西),這時(shí)下一個(gè)可以分配的地址對(duì)于結(jié)構(gòu)的起始地址的偏移量為12,剛好是 sizeof(int)=4的倍數(shù),所以把type存放在偏移量為12的地方,該成員變量占用sizeof(int)=4個(gè)字節(jié);這時(shí)整個(gè)結(jié)構(gòu)的成員變量 已經(jīng)都分配了空間,總的占用的空間大小為:8+1+3+4=16,剛好為結(jié)構(gòu)的字節(jié)邊界數(shù)(即結(jié)構(gòu)中占用最大空間的類型所占用的字節(jié)數(shù) sizeof(double)=8)的倍數(shù),所以沒有空缺的字節(jié)需要填充。所以整個(gè)結(jié)構(gòu)的大小為:sizeof(str_wu)=8+1+3+4=16, 其中有3個(gè)字節(jié)是VC自動(dòng)填充的,沒有放任何有意義的東西。
    而str_wu1,同樣的道理:如下:sizeof(char)=1,而1不 是8的倍數(shù),因而增加到8,sizeof(double)=8,現(xiàn)在開始地址是16,16是sizeof(int)的倍數(shù),可以存入。
    因而總的地址 數(shù):sizeof(char)+7+sizeof(double)+sizeof(int)=20,
    而20不是8的倍數(shù)(sizeof(double)=8),所以需要在增加4 個(gè)地址,即總共24。
    ----------------------
    sizeof具體的,我所知道的就這些了,那位高手還知道什么,或者我寫的有 什么錯(cuò),希望指出。謝謝!
    原文; http://lemonmilk.blog.51cto.com/499577/107155
    主站蜘蛛池模板: 精品熟女少妇aⅴ免费久久| 亚洲国产高清美女在线观看| 亚洲 另类 无码 在线| 日韩人妻无码免费视频一区二区三区| 国产92成人精品视频免费 | 亚洲一区中文字幕久久| 久久夜色精品国产亚洲AV动态图| 亚洲精品国产精品乱码不卡√ | 福利免费观看午夜体检区| 一色屋成人免费精品网站| 国产va免费精品观看精品| 国产成人A在线观看视频免费| 韩国二级毛片免费播放| 免费无码又爽又刺激高潮的视频| 在线免费观看视频你懂的| 国产老女人精品免费视频| 亚洲av无码乱码在线观看野外 | 免费v片视频在线观看视频| yy6080久久亚洲精品| 久久久久亚洲精品中文字幕| 亚洲精品无码专区久久久| 亚洲人成在线电影| 亚洲国产品综合人成综合网站| 亚洲 欧洲 自拍 另类 校园| 亚洲av无码成人精品国产| 成人国产网站v片免费观看| 成全视频在线观看免费| 永久在线免费观看| 好男人视频在线观看免费看片| 免费大片黄手机在线观看| 精品国产_亚洲人成在线高清| 亚洲视频小说图片| 亚洲av永久无码精品网址| h在线看免费视频网站男男| 久久久久免费精品国产小说| 国产v精品成人免费视频400条| 亚洲A∨午夜成人片精品网站| 国产亚洲一区二区精品| 国产精品亚洲四区在线观看| 爱情岛论坛免费视频| 一级毛片不卡片免费观看|