关于涉及指针的简单神秘函数的两个问题

Two questions about a simple mystery function involving pointers

我的 class 目前正在研究 C 中的指针,我们被要求解释以下函数在给定数组及其长度的情况下的作用。我目前理解它创建了一个指针*x,指向数组中的第一个元素,然后它创建了另一个指针*y,它指向数组的末尾。但是其余的我不明白。我总结一下我的问题:

1st:while 循环检查的是什么?换句话说,(x < y) 是什么意思?不应该是 (*x < *y) 吗?

2nd:while 循环是否简单地反转数组?如果是这样,x 和 y 值如何递增?我看不到 *x 和 *y 可以引用数组中第一个和最后一个元素以外的任何元素。

void mystery(int arr[], int len) {
    int *x = arr;
    int *y = arr + len - 1;
    while (x < y) {
        int t = *x;
        *x = *y;
        *y = t;
    }
}

预先感谢您提供您的见解和知识。

… it creates a pointer, *x,…

不是,x是指针。 *x 就是它所指向的。

… what does (x < y) mean?

x < y 测试 x 是否指向 y 的东西。 (这仅在 xy 指向相同的数组、结构或联合时定义。)在数组中,如果一个元素具有较低的索引,则它比另一个元素早。在结构中,如果一个成员在结构定义中的声明较早,则该成员早于另一个成员。在联合中,没有成员比其他成员早。

Does the while loop simply inverse the array?

循环中断了代码。它永远不会改变 xy,因此它永远不会改变条件 x < y 是否为真,因此,如果进入循环,它永远不会终止。它看起来像是旨在反转数组元素的代码。如果将其更改为:

while (x < y)
{
   int t = *x;
   *x++ = *y;
   *y-- = t;
}

然后,在每次迭代中,它会提前 x 并延迟 y。在数组的中间,它们将相等(如果有奇数个元素)或交叉(如果有偶数个元素)。无论哪种方式,x < y 都将为假,循环将停止,将前面的每个元素与后面反射位置的元素交换,从而反转数组内容。

上面的函数不会反转数组,因为 xy 不会改变导致程序卡在 while 循环。

要解决此问题,指针 x 应递增,而指针 y 应递减。当它们相等时,while 循环内的表达式求值为 false,从而中断循环。

循环应如下所示:

while(x < y) 
{
    int t = *x;
    *x++ = *y;
    *y-- = t;
}