Olhe para este código:
char nome[] = "Mickey Mouse";
const char *pc = nome;
char *const cp = nome;
const char *const cpc = nome;
Sabe dizer ao certo o que as três últimas constantes declaradas significam, na prática ?
Uma dica: tenta lê-las da direita para esquerda.
Nos casos exemplificados, fica:
- const char *pc pode ser lido como "pc é um ponteiro para um caractere constante".
- char* const cp pode ser lido como "cp é um ponteiro constante para um caractere".
- const char* const cpc pode ser lido como "cpc é um ponteiro constante para um caractere constante".
Vamos a explicação sintática, pra clarear mais o significado:
- Colocando const antes de um ponteiro (*), você torna o objeto constante - e não o ponteiro. (Ex: const char *pc faz o valor do caracterer ser constante, não o ponteiro.)
- Para o ponteiro ser constante, use *const.
- Não existe const*.
Mas ora bolas - você pode estar perguntando - para que serve um objeto constante ? E para que um ponteiro constante ?
Sua utilidade principal é em parâmetros de funções. Quando você declara um objeto constante, ele não pode ser modificado pela função. Logo, como a função fica proibida de modificar o objeto, você tem a garantia que o objeto passado por parâmetro ficou intacto após ser manipulado pela mesma. Ex.:
void Imprimir(const char *linha);
(No exemplo, linha não poderá ser modificada pela função pois ela é uma constante.)
Já um ponteiro constante garante que o ponteiro não apontará para mais nenhum objeto além do que foi inicializado. Ex.:
int a = 10, b = 20, c = 30;
int *pa = &a;
int *const pb = &b;
*pa = 50; // OK - pode mudar o valor
*pb = 90; // OK - pode mudar o valor
pa = &c; // OK - pa pode apontar para outro
pb = &a; // ERRO - pb só pode apontar para b
Bem aplicado, isto pode auxiliar a evitar erros no código.
Veja o caso de acima introduzirmos um ponteiro constante para uma constante:
const int *const pc = &c;
*pc = 70; // ERRO - nao pode mudar o valor
pc = &a; // ERRO - nao pode apontar para outro
(Nem o valor do objeto apontado nem o objeto apontado podem mudar.)
Coisas assim, são úteis para tornar nosso código menos propenso a erros (limitando possibilidades de atribuições incorretas), evitando maiores dores de cabeça na hora da depuração.
Nenhum comentário:
Postar um comentário