對於普通指標變數來說,其值是它所指向的位址,0表示空指標。
而對於資料成員指標變數來說,其值是資料成員所在位址相對於物件起始位址的偏移值,空指標用-1表示。例:
**示例:
structview codex ;#define value_of_ptr(p) (*(long*)&p)
intmain()
函式成員指標與普通函式指標相比,其size為普通函式指標的兩倍(x64下為16位元組),分為:ptr和adj兩部分。
(1) 非虛函式成員指標
ptr部分內容為函式指標(指向乙個全域性函式,該函式的第乙個引數為this指標),adj部分始終為0。例:
**示例:
extern"cview code"int printf(const
char*, ...);
struct
b };
struct d : public
b };
void (b::*pbfoo)() = &b::foo; //
ptr: points to _zn1b3fooev, adj: 0
void (d::*pdfoo)() = &d::foo; //
ptr: points to _zn1b3fooev, adj: 0
void (d::*pdbar)() = &d::bar; //
ptr: points to _zn1d3barev, adj: 0
extern"c
"void _zn1b3fooev(b*);
extern"c
"void _zn1d3barev(d*);
#define part1_of_ptr(p) (((long*)&p)[0])
#define part2_of_ptr(p) (((long*)&p)[1])
intmain()
(2) 虛函式成員指標
ptr部分內容為虛函式對應的函式指標在虛函式表中的偏移位址加1(之所以加1是為了用0表示空指標),而adj部分為調節this指標的偏移位元組數。例:
說明:**示例:
extern"cview code"int printf(const
char*, ...);
struct
a };
struct
b };
struct c : public a, public
b };
void (a::*pafoo)() = &a::foo; //
ptr: 1, adj: 0
void (b::*pbbar)() = &b::bar; //
ptr: 1, adj: 0
void (c::*pcfoo)() = &c::foo; //
ptr: 1, adj: 0
void (c::*pcquz)() = &c::quz; //
ptr: 9, adj: 0
void (c::*pcbar)() = &c::bar; //
ptr: 1, adj: 8
#define part1_of_ptr(p) (((long*)&p)[0])
#define part2_of_ptr(p) (((long*)&p)[1])
intmain()
參考:
c++ abi for itanium: 2.3 member pointers
深入理解資料成員指標 函式成員指標
對於普通指標變數來說,其值是它所指向的位址,0表示空指標。而對於資料成員指標變數來說,其值是資料成員所在位址相對於物件起始位址的偏移值,空指標用 1表示。例 示例 struct x define value of ptr p long p int main 函式成員指標與普通函式指標相比,其size...
深入理解C C 指標
c語言所有複雜的指標宣告,都是由各種宣告巢狀構成的。如何解讀複雜指標宣告呢?右左法則是乙個既著名又常用的方法。不過,右左法則其實並不是c標 準裡面的內容,它是從c標準的宣告規定中歸納出來的方法。c標準的宣告規則,是用來解決如何建立宣告的,而右左法則是用來解決如何辯識乙個宣告的,兩者可 以說是相反的。...
深入理解成員函式指標
include includeusing namespace std class test test void hello private int m i int main hello hello 為何 p null p hello 這樣之後,null hello 也依然有效呢?include in...