指针比较

Tal*_*ete 3 c pointers

我正在编写一个程序来模拟乌龟和兔子之间的比赛。

它们都沿着两个不同的由 70 个元素组成的一维数组移动,当然,由于它们向前和向后移动,它们最终可能会超出元素 0 或 69。

我想使用指针比较来检查它们是否这样做,所以问题来了:

我知道如果我们比较指向同一数组元素的指针,则指针比较是合法的,因为否则我们无法确定它们在内存中的位置。尽管如此,假设我们有:

char arr[70];
char *p1 = &arr[0]
char *p2 = &arr[69]
Run Code Online (Sandbox Code Playgroud)

我们不能确定p1 > p1 - 3p2 < p2 + 6,因为在这种情况下,地址将是连续的?我们确切地知道哪个先出现,哪个先出现,对吧?

我做了各种测试,看起来确实如此,但我想确定一下。

ex *_*ilo 5

不可以。仅比较指向数组对象内的元素或超出数组对象末尾的元素的指针才有效。但这里还有另一个问题。

正如上面定义的那样(p1指向 的第一个元素arrp2指向 的最后一个元素arr),您可能会认为尝试取消引用p1 - 3orp2 + 6会导致未定义的行为;但即使尝试形成地址p1 - 3p2 + 6使用指针算术也会导致未定义的行为,因此在尝试此指针算术时程序无效。您可以使用指针算术来形成数组对象内的地址,或超出数组对象末尾的地址。不能使用指针算术从指向数组元素的指针形成其他地址。