>> even the value held by bc changes. but nothing happens to bMember.
Of course something happens to bMember : you overwrite it here :
>> *bb = *ba;
bb points to the same B object as aa2->bMember, ie. both point to the object that bc points to.
So, when you dereference the bb pointer (*bb), you get that object (the same object that all the three mentioned pointers point to).
When you then assign *ba to that object, you overwrite it with the new data. This means that all three mentioned pointers will now point to that overwritten object.
I must say though that you're doing some really crazy stuff here. What's the point of all of this code ? It seems highly error prone, and unnecessarily complicated.