RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1189113
Accepted
Qwertiy
Qwertiy
Asked:2021-10-12 08:46:50 +0000 UTC2021-10-12 08:46:50 +0000 UTC 2021-10-12 08:46:50 +0000 UTC

可以将任何指针视为 1 个元素的数组吗?

  • 772

假设我们有类似的东西

char ch;

我们取地址:

char *p = &ch;

所以我们有一个指向char. 我们确信它是有效的。但是我们可以把它看作是一个指向一个元素的数组的指针吗?是的,这似乎是合乎逻辑的,但出现了一个有趣的观点:

如果表达式 P 指向数组对象的一个​​元素,而表达式 Q 指向同一数组对象的最后一个元素,则指针表达式 Q+1 比较大于 P。

如果我们说这个指针可以被认为是一个指向长度为 1 的数组的指针,那么这条标准意味着我们有权期望

assert(p < p + 1);

这实质上意味着任何有效指针都可以增加 1 并获得比前一个更大的数字(没有溢出)。标准能保证这一点吗?

对于 char,有 2 个有趣的地址 0x7FFFFFFF 和 0xFFFFFFFF - 如果 4 字节(对于 8 字节有类似的数字 - 本质不变)指针由带符号类型表示,则它们中的第一个将溢出,并且第二 - 如果未签名。我希望指针是无符号的,并且-1- 一个未使用的保留地址,但标准中可能没有关于此的内容。但是如果你仔细想想,对于其他数据类型,increment 会增加指针类型的大小,而不是增加 1,所以地址会稍微小一些。但同样,数据将不得不影响这些地址之一。

c++
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    wololo
    2021-10-12T17:28:16Z2021-10-12T17:28:16Z

    C++

    basic.compound/3:

    For purposes of pointer arithmetic ([expr.add]) and comparison ([expr.rel], [expr.eq]), a pointer past the end of the last element of an array xof nelements is considered to be equivalent to a pointer一个假设的数组元素和一个不是数组元素n的类型的对象被认为属于一个具有一个类型元素的数组。xTT

    出于指针算术 ([expr.add]) 和比较 ([expr.rel], [expr.eq]) 的目的,指向紧跟在元素数组的最后一个元素之后的x元素n的指针被认为等同于指针到一个假设的n数组元素x。此外,T不是数组元素的类型对象被认为属于一个类型元素的数组T。

    表达式/ 复合表达式 / 一元表达式 / 一元运算符 / 3 给出了一个例子:

    int a;
    int* p1 = &a;
    int* p2 = p1 + 1;   // defined behavior
    bool b = p2 > p1;   // defined behavior, with value true
    

    C 采用了类似的方法。

    6.5.6 加法运算符 / 7:

    就这些运算符而言,指向不是数组元素的对象的指针与指向长度为 1 且对象类型作为其元素类型的数组的第一个元素的指针的行为相同。

    对于这些加法运算符,指向不是数组元素的对象的指针的行为类似于指向长度为 1 的数组的第一个元素的指针,对象的类型为数组元素类型。

    6.5.6 加法运算符 / 8:

    ...如果表达式P指向数组对象的最后一个元素,则表达式(P)+1指向数组对象的最后一个元素,如果表达式指向数组对象的最后一个元素,则表达式指向Q数组对象的最后一个元素(Q)-1数组对象的元素。

    ...如果表达式P指向数组的最后一个元素,则表达式(P)+1指向紧跟数组最后一个元素的元素。如果表达式Q指向紧跟数组最后一个元素的元素,则表达式(Q)-1指向数组的最后一个元素。

    6.5.8 关系运算符/4:

    就这些运算符而言,指向不是数组元素的对象的指针与指向长度为 1 且对象类型作为其元素类型的数组的第一个元素的指针的行为相同。

    对于这些关系运算符,指向非数组元素的对象的指针的行为类似于指向单位长度数组的第一个元素的指针,对象的类型为数组元素类型。

    • 8
  2. Aziz Umarov
    2021-10-12T10:15:55Z2021-10-12T10:15:55Z

    让我从这里给你摘录几段。

    标准(第一)

    就指针而言,标准仅保证 0 是一个标记值。无法保证底层内存表示;它的实现定义。

    除了读取指针状态或写入新状态(包括取消引用或指针算术)之外,使用设置为该标记值的指针是未定义的行为。

    另一个答案

    C++ 标准不“保留”除零(空)以外的任何指针地址。因此,使用 1 或任何其他值作为“魔术”指针值是不安全的。当然,在实践中,c++ 的某些实现可能并非每个都使用某些值。但是您无法从语言定义中得到任何保证。

    简而言之,该标准并不限制您增加指针,但它不能保证任何事情,有很多依赖项,特定的操作系统,特定的编译器实现,所有这些都各不相同。

    并且简单地检查了您的比较示例。在边界处为 p 设置一个值并递增我不认为这是非法的。现实中能不能得到这样的p值是另外一回事。

    • 0

相关问题

  • 编译器和模板处理

  • 指针。找到最小数量

  • C++,关于枚举类对象初始化的问题

  • 函数中的二维数组

  • 无法使用默认构造函数创建类对象

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5