gpt4 book ai didi

c - 标准中关于指针比较的奇怪措辞

转载 作者:太空狗 更新时间:2023-10-29 15:08:14 26 4
gpt4 key购买 nike

§6.5.8\6 (关于>、<、<=、>=)

If the expression P points to an element of an array object and the expression Q points to the last element of the same array object, the pointer expression Q+1 compares greater than P . In all other cases, the behavior is undefined.

上面的几个部分,§6.5.8,解释了基本上,指针算法在数组上按预期工作。即 int a[3];整数 *p = a; int *q = &a[2];//q-p == 3 有效。但是,正如我阅读上面的 q > p 是 UB。

我错过了什么?

最佳答案

首先,你引用了一段的一部分,第一部分解释了这是引用什么,我把这段包含在这里:

When two pointers are compared, the result depends on the relative locations in the address space of the objects pointed to. If two pointers to object types both point to the same object, or both point one past the last element of the same array object, they compare equal. If the objects pointed to are members of the same aggregate object, pointers to structure members declared later compare greater than pointers to members declared earlier in the structure, and pointers to array elements with larger subscript values compare greater than pointers to elements of the same array with lower subscript values. All pointers to members of the same union object compare equal. If the expression P points to an element of an array object and the expression Q points to the last element of the same array object, the pointer expression Q+1 compares greater than P. In all other cases, the behavior is undefined.

基本上,您所引用的位指的是这样一个事实,即通常指针必须始终指向一个独立的对象、对象数组的一个元素或过去的一个对象数组的末尾。如您所见,通常递增一个已经指向数组最后一个元素的指针会产生一个无效指针,实际上这个标准中的指针绝不能被取消引用,但是它可以用于一种特殊情况,即它可以设置或与另一个指针进行比较。

这在程序中很有用,在该程序中,您递增一个指针,然后检查它是否超过数组末尾,如果超过则终止。例如。

int foo = 0;
int ArrSize = 6;
int bar[ArrSize];
while(foo < ArrSize)
{
foo++;
printf("%d", bar + 3 < bar + foo);
}

将是合法的,即使在 foo 指向数组末尾之外的最后一个例子中也是如此。

请注意,此示例非常做作,但说明了这一点。

如果没有这个规则,这个程序将是未定义的行为。

关于c - 标准中关于指针比较的奇怪措辞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16544645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com