Li muitas perguntas antigas, muitas respostas sobre const
palavras-chave em uma declaração para entender profundamente a sintaxe das declarações.
Eu brinquei const
e agora estou um pouco confuso com este exemplo:
int i;
i=1;
int const *ptr_i;
ptr_i=&i;
printf("%d\n",*ptr_i);
i=2;
printf("%d\n",*ptr_i);
Se int const *
é um ponteiro para um número inteiro constante , por que ptr_i=&i;
é permitido? i
não é um número inteiro constante.
Além disso, se o valor de i
for alterado de 1 para 2 (obviamente, é possível porque i
não é um número inteiro constante), o segundo printf
exibirá 2. Não estou surpreso porque o valor de i
foi alterado e ptr_i
é um ponteiro para i
.
Também verifiquei se o valor de ptr_i não mudou ( printf("%p ",ptr_i)
).
Onde está meu mal-entendido?
int const *
não é um ponteiro para um número inteiro constante. É um ponteiroint
para o qual oint
tipo está qualificado comconst
.const
é um nome impróprio. “Somente leitura” está mais próximo de uma descrição precisa; significa que “com este tipo o valor será apenas lido”. O que significa que outra pessoa com um ponteiro diferente (mesmo valor, tipo diferente) pode escrever no objeto.Também não é puramente somente leitura. Em C, se um objeto foi definido sem
const
, mas você tem um ponteiro do tipoconst int *
, você pode converter o ponteiroint *
e usar o novo ponteiro para modificar o objeto, e isso é definido pelo padrão C.const
foi adicionado tarde à linguagem, por isso é um pouco enxertado em vez de totalmente integrado e não serve como uma solução completa para evitar gravações em objetos. Principalmente, ele executa um serviço de consultoria : quando um tipo é qualificado comconst
, o compilador deve avisá-lo sobre tentativas de usá-lo diretamente para modificar um objeto para o qual ele aponta. Isso ajuda os programadores a evitar bugs.Você decidiu que o objeto referenciado por
ptr_i
(neste casoi
) não deveria ser alterado usando este ponteiro. Mas esse ponteiro pode fazer referência a umconst
objeto não.NÃO funciona ao contrário.
No trecho acima,
*ptr = 6;
invoca Comportamento Indefinido conforme você modificaconst
o objeto qualificado.