¿Incrementar / disminuir o agregar un valor entero a un puntero que no apunta a un elemento en una secuencia Comportamiento indefinido?

Dec 07 2020

Sé que los punteros (al elemento de la matriz) y los iteradores se pueden incrementar / disminuir para recorrer una secuencia de elementos y pueden saltar hacia atrás y hacia los elementos de la secuencia.

Pero, ¿qué pasará si incremento un puntero a un solo objeto o le agrego un valor entero? ¿Es un comportamiento indefinido o está bien, pero no podemos acceder a esa memoria?

int x = 551;
int* p = &x;
++p;
--p;
std::cout << *p << '\n';

Porque ya leí que no debemos incrementar / disminuir un puntero que no apunte a un elemento en una secuencia o matriz, por ejemplo.

Entonces, ¿alguien puede explicar qué pasará y si mi ejemplo está bien (quitando referencia al puntero p)? ¡Gracias!

Respuestas

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

cuando la aritmética de puntero se aplica a un puntero que apunta a un objeto, se considera que el puntero apunta a una matriz de ese tipo de objeto con un solo elemento, como se dice en el estándar .

Un objeto que no es un elemento de matriz se considera que pertenece a una matriz de un solo elemento para este propósito

In you example, the pointer p as if it point to int arr[1] = {551} So, the corresponding operation is similar to apply to a pointer that point to the arr. That means, ++p will make p point to the element arr[1] (hypothetical), and --p will make p point to the first element arr[0] again. So, in the last, de-referenceing pointer p is OK and does not result in any UB.