c++ - 是否对未指向序列未定义行为中的元素的指针递增/递减或添加整数值?

标签 c++ pointers language-lawyer pointer-arithmetic

我知道指针(指向数组元素)和迭代器可以递增/递减以遍历元素序列,并且可以在序列中来回跳转元素。
但是如果我增加一个指向单个对象的指针或向它添加一个整数值会发生什么?这是未定义的行为还是可以但我们无法访问该内存?

int x = 551;
int* p = &x;
++p;
--p;
std::cout << *p << '\n';
因为我已经读过我们不应该增加/减少不指向序列或数组中元素的指针。
那么有人可以解释会发生什么以及我的示例是否正常(取消引用指针 p)?谢谢!

最佳答案

当指针算术应用于指向对象的指针时,该指针被认为指向只有一个元素的该对象类型的数组,如 standard 中所述。 .

An object that is not an array element is considered to belong to a single-element array for this purpose


在您的示例中,指针 p好像它指向int arr[1] = {551}因此,相应的操作类似于应用于指向 arr 的指针。 .这意味着,++p将使p指向元素 arr[1](假设),和 --p将使p再次指向第一个元素 arr[0]。因此,在最后,取消引用指针 p没问题,不会导致任何 UB。

关于c++ - 是否对未指向序列未定义行为中的元素的指针递增/递减或添加整数值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65172368/

相关文章:

c++ - 尽管使用静态 unique_ptr 进行析构函数调用,但内存泄漏

c++ - C++是否使用接口(interface)?

c - 指针和指针功能

C++ : ((A*)nullptr)->foo(); is legal?

C++11 右值两次调用析构函数

c++ - 为什么 c++ 中的分配器为 void 类型提供专门化

Objective-C 指针值

c - 指针数组问题

c++ - 在早期检测成语实现中使用 void 模板参数

c++ - 具有静态存储持续时间的对象中未初始化的指针是否初始化为 NULL 或全零?