É 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?

Dec 07 2020

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

2 告白气球 Dec 23 2020 at 16:33

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 pcomo 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 ++pque fará o pponto para o elemento arr [1] (hipotético), e --pfará o pponto para o primeiro elemento arr [0] novamente. Portanto, no final, o ponteiro de des-referência pestá OK e não resulta em nenhum UB.