#include <iostream>
using namespace std;

struct A {unsigned char _data;};
struct B {unsigned char _data;};
struct C {A a; B b;};

C& get_parent(A& ar)
{
	return *reinterpret_cast<C*>(reinterpret_cast<char*>(&ar) - offsetof(C, a));
}

B& get_sister(A& ar)
{
	return get_parent(ar).b;
}

int main() {
	C c;
	cout << "&c = " << &c << endl;
	cout << "&c.a = " << &(c.a) << endl;
	cout << "&c.b = " << &(c.b) << endl;
	
	A& ar = c.a;
	cout << "&ar = " << &ar << endl;
	
	B& br = get_sister(ar);
	cout << "&br = " << &br << endl;

	C& cr = get_parent(ar);
	cout << "&cr = " << &cr << endl;

	return 0;
}