Solution 1 is good but doesn't differentiate the different flavors of const. Consider the following:
int i1 = 0;
const int i2 = 0;
char* c1 = "...";
char* const c2 = "...";
char const* c3 = "...";
const char* c4 = "...";
const char* const c5 = "...";
I think you have i1 and i2 figured out. Pointers complicate it a little.
c1 is a pointer to char that can be modified at will. c2 is a const pointer to char (can't change where c2 points but you can change what it points to). c3 and c4 are the same thing. c3/c4 are pointer to const char (you can change where c3/c4 points but can't change what they point to). c5 is a const pointer to const char (can't change where it points or what it points to).
Introduction of 'typedef' into the mix invites a whole new dimension.