Увеличивает / уменьшает или добавляет целочисленное значение к указателю, который не указывает на элемент в последовательности Undefined Behavior?

Dec 07 2020

Я знаю, что указатели (на элемент массива) и итераторы могут увеличиваться / уменьшаться для обхода последовательности элементов и могут перемещаться назад и для элементов в последовательности.

Но что произойдет, если я увеличу указатель на один объект или добавлю к нему целое значение? это неопределенное поведение или все в порядке, но мы не можем получить доступ к этой памяти?

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

Потому что я уже читал, что мы не должны увеличивать / уменьшать указатель, который, например, не указывает на элемент в последовательности или массиве.

Так может ли кто-нибудь объяснить, что произойдет, и в порядке ли мой пример (указатель разыменования p)? Спасибо!

Ответы

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

когда арифметика указателя применяется к указателю, указывающему на объект, считается, что указатель указывает на массив этого типа объекта только с одним элементом, как сказано в стандарте .

Для этой цели объект, не являющийся элементом массива, считается принадлежащим к одноэлементному массиву.

В вашем примере указатель, pкак если бы он указывает на int arr[1] = {551}So, соответствующая операция аналогична применению к указателю, указывающему на arr. Это означает, что ++pбудет pуказывать на элемент arr [1] (гипотетический) и --pснова pуказывать на первый элемент arr [0]. Таким образом, в последнем указатель отмены ссылки pв порядке и не приводит к какому-либо UB.