Diferença entre const int*, int * const e const int * const em C++
Olá a todos! Acabei de começar a aprender C++ e não consigo entender a palavra-chave `const` no contexto de ponteiros. Olho para três declarações diferentes e fico completamente confuso:
1. `const int* ptr;`
2. `int* const ptr;`
3. `const int* const ptr;`
Por que elas significam coisas diferentes? Qual delas permite alterar o valor para o qual o ponteiro aponta, e qual permite alterar o próprio ponteiro? Escrevi um pequeno exemplo:
```cpp
int a = 10;
int b = 20;
const int* p1 = &a;
// *p1 = 30; // erro, se descomentar
p1 = &b; // funciona
int* const p2 = &a;
*p2 = 30; // funciona
// p2 = &b; // erro, se descomentar
const int* const p3 = &a;
// *p3 = 30; // erro
// p3 = &b; // erro
```
Estou entendendo corretamente que `const` à esquerda do asterisco protege os dados, e à direita protege o próprio ponteiro? Ou existe uma regra mais simples para memorizar? Expliquem, por favor, como isso funciona e em quais casos usar cada variante. Desde já, obrigado!
<<>>