pab*_*977 0 c pointers c99 language-lawyer c11
我在这个网站上已经阅读了几个关于这个主题的问题,但我仍然有疑问.
在标准C中,我们可以阅读:
6.3.2.3.p.5:整数可以转换为任何指针类型.[...]
6.3.2.3.p.6:任何指针类型都可以转换为整数类型.[...].
省略的文本(将放在括号[...]中)只讨论转换失败时可能发生的问题.
但是我的问题更为笼统:
我的问题是:我的解释(3)是正确的吗?
另一方面,当我们定义一个大小为N的类型T的数组时,
由于我们可以对数组的位置进行整数运算,
因此很明显,至少在"本地"级别,在数组中,
我们有相应的数组内存块的
运算方式与从0到N-1的数字集相同.
通过定义数组或分配的对象,我们可以确定,在C中,
内存地址可以被"本地"视为算术上等同于整数的子集.
然而,这种"局部"行为不足以得出
标准C假设存储器模型的结论,该存储器模型的存储器地址可被视为"仅一个且同一组整数"的一部分.
然而,6.3.2.3.p5/p6似乎"暗示"这个更强大的断言,尽管我并不完全确定.
另一个问题可能会带来更多亮点:
p,q,(即:p != q)中,当转换成整数型,所得到的整数值变得相等.奇怪的是,你忽略了标准的一部分,"只是谈论转换失败时可能发生的问题",其中一些正是解决你的问题的部分.
- 我观察到整数数学数字是无限的一组值.
没错,但无关紧要.标准说"任何指针类型都可以转换为[任何]整数类型 "(强调添加).它具体指C类数据类型,包括但不限于int.您在引用中省略的文本清楚地表明某些整数类型可能无法表示结果.事实上,它说"结果不必在任何整数类型的值范围内"(强调添加).
- C中的任何整数类型只能表示整数数学值的有限子集.
真正.
- 在第6.3.2.3.p5/p6段中,似乎标准C11假定"每个指针值都可以映射到整数数学值".
不,事实上不是.您省略的部分内容是"结果是实现定义的",用于双向转换,但有一些例外.这种转换的实现定义行为可能是程序退出.我接受标准表明可能存在您所描述的映射或映射,但并不是假设存在映射或映射.
- 此外,编辑C11标准的方式似乎表明只有当这个数学(或抽象)值无法用开发者选择的整数类型表示时,无论出于何种原因,操作都会失败.
操作永远不会失败.在许多情况下,行为是实现定义的,在某些情况下,它是未定义的,但这完全不同.
但请注意,标准对选择提供可选intptr_t和/或uintptr_t类型的实现提出了更多要求,因为它们支持往返,保留void *整数类型到void *转换的值.这样的实现(典型的)必须具有从所有可能的指针值的1-1映射,不仅是数学整数而且是可表示的整数值.