• <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>

            天行健 君子當自強而不息

            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) ,'&'為取址運算符;
            那么&(pAAA->i)一定等于0x1234,因為i是結(jié)構體AAA的第一個元素。
            而&(pAAA->j)一定是0x1234 + 0x4 = 0x1238; 因為sizeof(int) = 4;

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

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

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

            也就是說:

            0 ---> (s *)0

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

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

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

            公告

            導航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            久久国语露脸国产精品电影| 午夜精品久久久内射近拍高清 | 久久福利片| 国产精品中文久久久久久久| 久久精品人人槡人妻人人玩AV | 手机看片久久高清国产日韩 | 东方aⅴ免费观看久久av| 99久久免费国产精品热| 亚洲人成无码www久久久| 国产精品99久久久久久宅男| 伊人久久综合无码成人网| av国内精品久久久久影院 | 国产精品久久久亚洲| 精品乱码久久久久久夜夜嗨| 一本一本久久A久久综合精品| 国产 亚洲 欧美 另类 久久 | 亚洲精品美女久久久久99小说| 久久久久亚洲精品无码蜜桃| 精品久久人人妻人人做精品| 99精品国产在热久久| 国产69精品久久久久观看软件| 狠狠人妻久久久久久综合蜜桃 | 久久国产色AV免费观看| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 天堂无码久久综合东京热| 久久夜色精品国产亚洲| 超级碰久久免费公开视频| 久久夜色精品国产噜噜麻豆| 久久99热只有频精品8| 精品久久久久久国产| 亚洲午夜无码久久久久小说| 久久777国产线看观看精品| 国产精品亚洲综合专区片高清久久久| 亚洲中文字幕无码久久精品1| 精品久久久久成人码免费动漫| 伊人久久免费视频| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久国产高清字幕中文| 国产精品久久久久久搜索| 99国产欧美精品久久久蜜芽| 成人久久精品一区二区三区|