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

2022-07-04 22:18:14 字數 2060 閱讀 2724

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

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

**示例:

struct

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

intmain()

view code

函式成員指標與普通函式指標相比,其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])

intmain()

view code

(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])

intmain()

view code

參考:

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