• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天行健 君子當(dāng)自強(qiáng)而不息

            offsetof宏解析


            今天看代碼時,發(fā)現(xiàn)一個有用的東東,offsetof(s,m),這是一個宏,MSDN文檔的說明如下:

            Retrieves the offset of a member from the beginning of its parent structure.

            size_t offsetof(
            structName,
            memberName
            );


            Parameters

            structName
            Name of the parent data structure.


            memberName
            Name of the member in the parent data structure for which to determine the offset.


            Return Value


            offsetof returns the offset in bytes of the specified member from the beginning of its parent data structure. It is undefined for bit fields.

            Remarks

            The offsetof macro returns the offset in bytes of memberName from the beginning of the structure specified by structName. You can specify types with the struct keyword.

            Note


            offsetof is not a function and cannot be described using a C prototype.

            跟蹤代碼發(fā)現(xiàn)定義如下:

            #define offsetof(s,m) (size_t)&(((s *)0)->m)

            然后到網(wǎng)上查了一下,發(fā)現(xiàn)還真的是很有用,附帶一位大俠的解說:

            struct AAA
            {
                int i;
                int j;
            };

            struct AAA *pAAA;
            pAAA=new AAA;


            這時,pAAA實際上是一個Pointer, 指向某一確定的內(nèi)存地址,比如0x1234;
            而 pAAA->i 整體是一個int型變量,其地址是&(pAAA->i) ,'&'為取址運(yùn)算符;
            那么&(pAAA->i)一定等于0x1234,因為i是結(jié)構(gòu)體AAA的第一個元素。
            而&(pAAA->j)一定是0x1234 + 0x4 = 0x1238; 因為sizeof(int) = 4;

            這個做法的巧妙之處就是:它把“0”作為上例中的pAAA,那么 &(pAAA->j)就是j的offset啦。

            解析結(jié)果是:
            (s *)0 ,將 0 強(qiáng)制轉(zhuǎn)換為Pointer to "s"
            可以記 pS = (s *)0 ,pS是指向s的指針,它的值是0;
            那么pS->m就是m這個元素了,而&(pS->m)就是m的地址,而在本例中就是offset啦

            再把結(jié)果強(qiáng)制轉(zhuǎn)換為size_t型的就OK 了,size_t其實也就是int啦!!

            也就是說:

            0 ---> (s *)0

            原來的0是數(shù)值類型,現(xiàn)在是結(jié)構(gòu)體指針類型,盡管類型變了,但其值還是不變,也就是說還是0,但這個值的意義變了,現(xiàn)在是地址,而不是數(shù)值。

            &(((s *)0)->m)求出字段m的地址值,但由于首地址是0,所以&(((s *)0)->m)求出字段m相對于首地址的偏移值。

            posted on 2007-09-24 19:04 lovedday 閱讀(3755) 評論(0)  編輯 收藏 引用 所屬分類: ▲ C Program

            公告

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關(guān)鏈接

            搜索

            最新評論

            久久精品国产精品亚洲人人 | 97久久国产亚洲精品超碰热| 色青青草原桃花久久综合| 亚洲国产视频久久| 777米奇久久最新地址| 91精品国产91久久久久久青草| 久久久久久国产精品免费免费| 久久精品中文字幕大胸| 国产精品久久自在自线观看| 久久久精品国产亚洲成人满18免费网站| 亚洲v国产v天堂a无码久久| 亚洲精品乱码久久久久久中文字幕 | 国产精品久久久久影视不卡| 狠狠精品久久久无码中文字幕 | 精品999久久久久久中文字幕| 久久99精品久久久久久不卡| 婷婷久久久亚洲欧洲日产国码AV | 久久久WWW成人免费精品| 色综合久久久久综合体桃花网 | 欧美日韩精品久久免费| 91精品免费久久久久久久久| 色诱久久久久综合网ywww| 性欧美大战久久久久久久| 91久久精品国产免费直播| 97久久香蕉国产线看观看| 久久国产亚洲高清观看| 久久久久亚洲AV成人网人人网站| 久久激情五月丁香伊人| 91精品国产高清久久久久久91 | 色狠狠久久综合网| 一本久久精品一区二区| 久久精品一区二区三区中文字幕| 国产精品久久国产精品99盘 | 久久亚洲国产精品123区| 亚洲一区二区三区日本久久九| 国产成人综合久久综合| 久久亚洲AV成人无码国产| 久久夜色精品国产噜噜噜亚洲AV| 亚洲熟妇无码另类久久久| 国产色综合久久无码有码| 人妻无码αv中文字幕久久 |