É incrementar / decrementar ou adicionar um valor inteiro a um ponteiro que não está apontando para um elemento em uma seqüência de comportamento indefinido?
Eu sei que ponteiros (para elemento de array) e iteradores podem ser incrementados / decrementados para percorrer uma sequência de elementos e podem saltar para trás e para elementos na sequência.
Mas o que acontecerá se eu incrementar um ponteiro para um único objeto ou adicionar a ele um valor inteiro? é um comportamento indefinido ou está OK, mas não podemos acessar essa memória?
int x = 551;
int* p = &x;
++p;
--p;
std::cout << *p << '\n';
Porque eu já li que não devemos incrementar / decrementar um ponteiro que não aponta para um elemento em uma sequência ou array, por exemplo.
Então, alguém pode explicar o que vai acontecer e se meu exemplo está OK (de-referenciar o ponteiro p)? Obrigado!
Respostas
quando a aritmética de ponteiro se aplica a um ponteiro que aponta para um objeto, considera-se que o ponteiro aponta para uma matriz daquele tipo de objeto com apenas um elemento, conforme dito no padrão .
Um objeto que não é um elemento de matriz é considerado como pertencente a uma matriz de elemento único para este propósito
Em seu exemplo, o ponteiro p
como se ele apontasse para int arr[1] = {551}
So, a operação correspondente é semelhante a se aplicar a um ponteiro que aponta para o arr
. Isso significa ++p
que fará o p
ponto para o elemento arr [1] (hipotético), e --p
fará o p
ponto para o primeiro elemento arr [0] novamente. Portanto, no final, o ponteiro de des-referência p
está OK e não resulta em nenhum UB.