int main() { const int a = 1; // no problem assigning the value of a const variable to a non-const variable int b = a; // equivalent types const int* c = &a; // const cast must be used to assign (pointer to const) => (pointer) int* d = const_cast(c); // no cast required to assign (pointer) => (pointer to const) const int* e = d; // no cast required to go from (pointer) => (const pointer) int* const f = d; // no cast required to go from (const pointer) => (pointer) // this is just assigning the value of a non-changable pointer int* g = f; // equivalent types int const ** h = &c; // equivalent types int*const* i = &f; // initialize constant pointer to pointer to int int**const j = &d; // const cast required to go from (pointer to const pointer) => (pointer to pointer) int** k = const_cast(i); // no cast required to go rom (pointer to pointer) => (const pointer to const pointer to const) int const *const*const m = k; return 0; }