【发布时间】:2018-08-16 00:00:56
【问题描述】:
很遗憾,我没有找到类似 std-discussion 的 ISO C 标准,所以我会在这里问。
在回答问题之前,请确保您熟悉指针出处的概念(请参阅DR260 和/或http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2263.htm)。
6.3.2.3(指针)第 7 段说:
当指向对象的指针转换为指向字符类型的指针时, 结果指向对象的最低寻址字节。的连续递增 结果,直到对象的大小,产生指向对象剩余字节的指针。
问题是:
-
“指向对象的指针”是什么意思?这是否意味着如果我们想要获得指向
T类型对象的最低寻址字节的指针,我们应该将类型为cvT*的指针转换为指向字符类型,并将指针转换为void,从T*类型的指针获得,不会给我们想要的结果吗?或者“指向对象的指针”是指针的值,它从指针出处开始并转换为void*不会改变值(类似于它最近在 C++17 中的形式化方式)? 为什么段落明确提到增量?这是否意味着添加大于 1 的值是未定义的?这是否意味着递减(在我们多次递增结果以便我们不会超出下对象边界之后)是未定义的?简而言之:组成对象的字节序列是数组吗?
【问题讨论】:
-
"指向对象的指针" --> 指向某个非函数的指针,非
void。 -
“强制转换为 void* 不会改变值”几乎是正确的。 编码可能会改变,但它会等同于原始。类似于
10 == 10.0,但它们有不同的编码。指针具有与整数不同的属性。这里有很多问题 - 至少 7 个。也许可以减少它。 -
虽然一个理性的人可能质疑“递增 -1”(而不是“递减 1”)的有效性,但我认为可以肯定地说您可以递增任何正数。
i+=5;//a stupid but accurate comment here is 'increment by 5'。关于您的最后一个问题,您是否特别想知道字节是否是连续的并且是否可以被视为 C 数组,或者您是否正在驾驶不同的东西? -
@zzxyz 我不认为你可以增加任何正数。该标准在 6.5.2.4(后缀)和 6.5.3.1(前缀)中定义了增量。我认为为标准中定义的术语创造自己的含义是不正确的。
-
@M.M 如果我理解正确,您是想说省略明确的行为定义并不会使其未定义。好吧,标准明确说明了相反的情况。
标签: c language-lawyer