Troszke źle kombinujesz. Pozwój, że skomentuję Twoje 2 "sposoby".
1. - najbardziej oczywiste wydawało mi się:
*wsk_norm = reinterpret_cast<wsk_c*>(szesc)
reinterpret_cast rzutuje wskaźnik na inny typ wskaźnika. Powyższy przykład jest w ogóle źle zapisany. Tak się rzutuje za pomocą reinterpret_cast<> (przykład)
int n = 5;
int * wsk_int = &n;
short int * wsk_sint = reinterpret_cast< short int* >( wsk_int );
Czytamy: przypisz wskaźnikowi typu short int adres, który posiada wskaźnik typu int i aby to przypisanie się udało, zaufaj mi drogi kompilatorze i potraktuj wsk_int jako wskaźnik na short int. W efekcie kompilator myśli, że po obu stronach znaku = stoją wskaźniki tego samego typu. W Twoim przypadku reinterpret jest niepotrzebny.
2. *wsk_norm = reinterpret_cast<const int>(*wsk_c)
*wsk_norm = static_cast<const int>(wsk_c*) // tutaj też nic.
I znowu źle użyty operator rzutowania. Niech odpowiedzią będzie poniższy kod, który działa tak jak chciałeś, aby działał Twój program.
#include <iostream>
using namespace std;
int main()
{
const int szesc = 6;
const int *wsk_c = &szesc;
int * wsk_norm;
wsk_norm = const_cast<int*>(wsk_c);
cout << *wsk_norm;
return 0;
}
Komentarz do linijki:
wsk_norm = const_cast<int*>(wsk_c);
Przypisz do wsk_norm wartość wskaźnika wsk_c. Wiem drogi kompilatorze, że wsk_c pokazuje na const, a ja próbuję przypisać jej adres wskaźnikowi, który nie gwarantuje, że nie zmieni jej wartości. Dlatego proszę cię kompilatorze, potraktuj wsk_c jak wskaźnik na zwykły int <int*> i daj mi spokój ;-)
Wobec czego kompilator myśli, że po obu stronach znaku = stoją zwykłe wskaźniki typu int. Dlatego takie przypisanie się może udać.
Oczywiście nie muszę chyba dodawać, że korzystanie z tej sztuczki, aby zmieniać wartości stałych, to programistyczny grzech niewybaczalny :P
Mam nadzieję, że pomogłem. Pozdrawiam :-)