深入理解資料成員指標 函式成員指標

2021-09-04 13:46:32 字數 1903 閱讀 8058

對於普通指標變數來說,其值是它所指向的位址,0表示空指標。

而對於資料成員指標變數來說,其值是資料成員所在位址相對於物件起始位址的偏移值,空指標用-1表示。例:

**示例:

struct x ;

#define value_of_ptr(p) (*(long*)&p)

int main()

函式成員指標與普通函式指標相比,其size為普通函式指標的兩倍(x64下為16位元組),分為:ptr和adj兩部分。

(1) 非虛函式成員指標

ptr部分內容為函式指標(指向乙個全域性函式,該函式的第乙個引數為this指標),adj部分始終為0。例:

**示例:

extern "c" 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])

int main()

(2) 虛函式成員指標ptr部分內容為虛函式對應的函式指標在虛函式表中的偏移位址加1(之所以加1是為了用0表示空指標),而adj部分為調節this指標的偏移位元組數。例:

說明:

**示例:

extern "c" 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])

int main()

參考:c++ abi for itanium: 2.3 member pointers

原文

C C 雜記 深入理解資料成員指標 函式成員指標

對於普通指標變數來說,其值是它所指向的位址,0表示空指標。而對於資料成員指標變數來說,其值是資料成員所在位址相對於物件起始位址的偏移值,空指標用 1表示。例 示例 struct x define value of ptr p long p intmain view code 函式成員指標與普通函式指...

深入理解成員函式指標

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

深入理解c 成員函式

1 const成員函式 在成員函式後面加const,const修飾this指標所指向的物件,也就是保證呼叫這個const成員函式的物件在函式內不會被改變 思考以下幾種場景 1.const物件可以呼叫非const成員函式和const成員函式嗎?x 2.非const物件可以呼叫非const成員函式和co...