C标准是否要求指针是(整数)数字?
有人会说是的,因为指针算术...
但是另一方面,取决于操作方式,诸如--
或++
之类的操作可以理解为上一个存储位置,下一个存储位置它们在标准中进行了描述,并且实际的实现可以使用任何表示形式来保存指针数据(只要实现了上述操作)...
想到另一个问题-C是否要求数组/缓冲区等是连续的,即下一个元素存储在下一个存储位置(++p
,其中p是指针)?我问,是因为您经常会在网上看到似乎可以实现的实现。
答案 0 :(得分:3)
否,指针不必是纯数字。
如果您阅读该标准,则有相应规定:
两个指向不相关对象的指针(意味着不是更大对象的一部分,请记住结构和数组),除了相等性之外,不得进行比较。
6.5.8关系运算符
[...]
5比较两个指针时,结果取决于所指向对象的地址空间中的相对位置。如果两个指向对象或不完整类型的指针都指向同一个对象,或者都指向一个指向同一数组对象的最后一个元素的指针,则它们比较相等。如果所指向的对象是同一聚合对象的成员,则指向稍后声明的结构成员的指针比指向早于结构中声明的成员的指针要大,而指向具有较大下标的数组元素的指针要比指针大。 值比较下标值较低的指针指向同一数组元素的指针更大。指向同一联合对象的成员的所有指针比较相等。如果表达式P
指向数组对象的元素,而表达式Q
指向同一数组对象的最后一个元素,则指针表达式Q+1
比较大于{{1} }。在所有其他情况下,行为均未定义。
两个不相关对象的指针不能相减。
6.5.6加法运算符
[...]
9当减去两个指针时,两个指针均应指向同一数组对象的元素,或者指向数组对象的最后一个元素之后的元素;结果是twoarray元素的下标不同。结果的大小由实现定义,其类型(有符号整数类型)由P
标头中的ptrdiff_t
定义。如果结果无法在该类型的对象中表示,则该行为未定义。换句话说,如果表达式<stddef.h>
和P
分别指向数组对象的第 i 个元素和第 j 个元素,表达式Q
的值为 i ,条件是在类型(P)-(Q)
的对象中提供值fts。此外,如果表达式ptrdiff_t
指向数组对象的一个元素或指向数组对象的最后一个元素,而表达式P
指向同一数组对象的最后一个元素,则表达式Q
具有相同的含义 值分别为((Q)+1)-(P)
和((Q)-(P))+1
,并且如果表达式-((P)-((Q)+1))
指向数组对象的最后一个元素,即使表达式P
不指向其后,其值为零。指向数组object的元素。91)
可能没有一种将指针表示为数字的方法,因为可能不存在合适的类型。因此,尝试进行转换可能会导致行为未定义。
任何定义行为的具体实现并不意味着它不是根据标准的UB。
6.3.2.3指针
[...]
6任何指针类型都可以转换为整数类型。除非先前指定,否则结果是实现定义的。如果结果不能用整数类型表示,则行为未定义。结果不必在任何整数类型的值范围内。7.18.1.4能够容纳对象指针的整数类型
1以下类型指定一个带符号的整数类型,其属性是可以将指向
(Q)+1
的任何有效指针转换为该类型,然后再转换回指向void
的指针,结果将比较等于指向原始指针:void
以下类型指定一个无符号整数类型,其属性是可以将指向
intptr_t
的任何有效指针转换为该类型,然后再转换回指向void
的指针,结果将等于原始指针:void
这些类型是可选的。
那只是我的头顶,我敢肯定还有更多。
n1256(C99草案)中的所有引号。
始终要求数组是连续的。
答案 1 :(得分:0)
要回答数组中的第二个问题,元素应位于连续的Memory位置。这就是为什么使用指针算法在元素之间移动的原因。