Although the syntax of pointers to members may seem a bit confusing at first, it is consistent and resembles the form of ordinary pointers, with the addition of the class name followed by the operator :: before the asterisk. For example, if an ordinary pointer to int looks like this:
int * pi;
you define a pointer to an int member of class A like this:
class A{/**/}; int A::*pmi; // pmi is a pointer to an int member of A
You can initialize a pointer to member:
class A { public: int num; int x; }; int A::*pmi = &A::num; // 1
The statement numbered 1 defines a pointer to an int member of class A and initializes it with the address of the member num. Now you can use the pointer pmi to examine and modify the value of num in any object of class A:
A a1; A a2; int n = a1.*pmi; // copy the value of a1.num to n a1.*pmi = 5; // assign the value 5 to a1.num a2.*pmi = 6; // assign the value 6 to a2.num
Similarly, you can access a data member through a pointer to A:
A * pa = new A; int n = pa->*pmi; // assign to n the value of pa->num pa->*pmi = 5; // assign the value 5 to pa->num
Or using a pointer to an object derived from A:
class D : public A {}; A* pd = new D; pd->*pmi = 5; // assign a value of 5 to pd->num