在C18中,我们有:
§6.5.9p10
当且仅当两个都是空指针时,两个指针比较相等,两个指针都是指向同一对象的指针(包括指向对象和它的开头的子对象的指针)或函数,都是指向同一数组最后一个元素的指针object,或者是指向一个数组对象的末尾的指针,另一个是指向另一个数组对象的起点的指针,该数组对象恰好紧随地址空间中的第一个数组对象。
因此int a[4][2] = {{1, 2}, {3, 4}, {5, 6}, {7, 8}}
,我们可以拥有a[1] == a[0] + 2
。
结果可以保证*(a[1]) == *(a[0] + 2)
吗?
这是不容许取消引用这样一个指针,即使它比较等于另一个有效的指针。
关于+
操作员状态的第6.5.6p8节:
将具有整数类型的表达式添加到指针或从指针中减去时,结果将具有指针操作数的类型。如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向与原始元素偏移的元素,以使结果数组元素和原始数组元素的下标之差等于整数表达式。换句话说,如果表达式
P
指向数组对象的第i个元素,则表达式(P)+N
(等效于N+(P)
)和(P)-N
(其中N
值n的表达式)分别指向第i + n个和i-n -th数组对象的元素(如果存在)。而且,如果表达P
指向数组对象的最后一个元素,表达式(P)+1
指向数组对象的最后一个元素,如果表达式Q
指向一个数组对象的最后一个元素,则表达式(Q)-1
指向数组对象的最后一个元素。如果指针操作数和结果都指向同一数组对象的元素,或者指向数组对象的最后一个元素,则求值不应产生溢出。否则,行为是不确定的。如果结果指向数组对象的最后一个元素之后,则不应将其用作*
被评估的一元运算符的操作数
值得一提的是,一些编译器具有指针出处的概念,这意味着它在内部跟踪指针的来源。这样的结果是,如果两个不相关的变量在内存中相邻,则将一个地址与一个过去的地址进行比较,即使另一个地址相同,也将始终得出false。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句