Czy jest w tym wypadku jakaś różnica pomiędzy zapisem <int*> a <int * const>
tak, jest to inny typ danych.
Dzięki <int *> zapominamy że był to wskaźnik do stałej
zacznijmy od tego, że "obiekt" nie jest stałą.
ale chyba nie trzeba już nadawać przydomka const odpowiedzialnego na nieruchomość wskaźnika jak w zapisie <int * const>
fakt, można, ale nie trzeba - zależy jak chcesz go potem używać
, bo jest on dodawany przez domniemanie
bzdura, nigdy. typ napisany przez Ciebie explicite, zostaje ZAWSZE taki jak podales. nigdy kompilator nic do niego nie dopisze. jedyne gdzie kompilator sobie cos domniema to template'y oraz nadchodzace "auto" w C0x/C1x ew. var w .Net
Wydaje mi się, że wystarczy zapis <int *>
tak, w zupelnosci wystarczy
w skrocie:
int x = 5;
int const xc = 5;
int * px = 0;
int const * pxc = 0;
int * const pcx = 0;
int const * pcxc = 0;
to wszytko są RÓŻNE typy danych, każdy z nich pozwala Ci na inną rzecz. Zwróc uwage, że intencjonalnie używam zapisu z const-po-prawej, żeby "const int" stojace po lewej nie zaciemniało struktury zapisu..
X jest zmienną modyfikowalną (typ jej wartosci: int)
XC jest zmienną niemodyfikowalną, jest stałą (typ jej wartosci: int)
PX jest zmienną modyfikowalną (typ wartosci: int*, wartość tej zmiennej jest wskaznikiem na modyfikowalny element typu: int)
PXC jest zmienną modyfikowalną (typ wartosci: int const*, wartość tej zmiennej jest wskaznikiem na NIEmodyfikowalny element typu: int, to jest wskaznik-na-stałą)
PCX jest zmienną NIEmodyfikowalną (typ wartosci: int*, wartość tej zmiennej jest wskaznikiem na modyfikowalny element typu: int)
PCXC jest zmienną NIEmodyfikowalną, jest stałą (typ wartosci: int const *, wartość tej zmiennej jest wskaznikiem na NIEmodyfikowalny element typu: int)
stąd, pozniej:
x = 1; //ok
xc = 1; // blad - nie mozna modyfikowac zmiennej const
px = &x; //ok
*px = 4; //ok
pxc = &xc; //ok, wskaznik nie jest staly, mozna go zmieniac na inny
*pxc = 4; //blad, nie mozna modyfikowac wskazywanej przez niego stalej rzeczy
pcx = &x; //blad, wskaznik jest staly, nie mozna go modyfikowac
*pcx = 4; //ok, wskazywana rzecz nie jest stala, mozna ja modyfikowac
pcxc = &x; //blad, wskaznik jest staly
*pcxc = 4; //blad, wskazywana recz tez jest stala
rozumiesz teraz?
//edit: zaczalem dopisywac wyjasniania dot. konwersji danych, ale przy wysylaniu mi sie lacze zresetowalo i poprawka do postu wyparowala..
tymczasem wiec poczytaj sobie http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.16 oraz punkt nastepny