关于涉及指针的简单神秘函数的两个问题
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
早 的东西。 (这仅在 x
和 y
指向相同的数组、结构或联合时定义。)在数组中,如果一个元素具有较低的索引,则它比另一个元素早。在结构中,如果一个成员在结构定义中的声明较早,则该成员早于另一个成员。在联合中,没有成员比其他成员早。
Does the while loop simply inverse the array?
循环中断了代码。它永远不会改变 x
或 y
,因此它永远不会改变条件 x < y
是否为真,因此,如果进入循环,它永远不会终止。它看起来像是旨在反转数组元素的代码。如果将其更改为:
while (x < y)
{
int t = *x;
*x++ = *y;
*y-- = t;
}
然后,在每次迭代中,它会提前 x
并延迟 y
。在数组的中间,它们将相等(如果有奇数个元素)或交叉(如果有偶数个元素)。无论哪种方式,x < y
都将为假,循环将停止,将前面的每个元素与后面反射位置的元素交换,从而反转数组内容。
上面的函数不会反转数组,因为 x
和 y
不会改变导致程序卡在 while
循环。
要解决此问题,指针 x
应递增,而指针 y
应递减。当它们相等时,while 循环内的表达式求值为 false,从而中断循环。
循环应如下所示:
while(x < y)
{
int t = *x;
*x++ = *y;
*y-- = t;
}
我的 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
早 的东西。 (这仅在 x
和 y
指向相同的数组、结构或联合时定义。)在数组中,如果一个元素具有较低的索引,则它比另一个元素早。在结构中,如果一个成员在结构定义中的声明较早,则该成员早于另一个成员。在联合中,没有成员比其他成员早。
Does the while loop simply inverse the array?
循环中断了代码。它永远不会改变 x
或 y
,因此它永远不会改变条件 x < y
是否为真,因此,如果进入循环,它永远不会终止。它看起来像是旨在反转数组元素的代码。如果将其更改为:
while (x < y)
{
int t = *x;
*x++ = *y;
*y-- = t;
}
然后,在每次迭代中,它会提前 x
并延迟 y
。在数组的中间,它们将相等(如果有奇数个元素)或交叉(如果有偶数个元素)。无论哪种方式,x < y
都将为假,循环将停止,将前面的每个元素与后面反射位置的元素交换,从而反转数组内容。
上面的函数不会反转数组,因为 x
和 y
不会改变导致程序卡在 while
循环。
要解决此问题,指针 x
应递增,而指针 y
应递减。当它们相等时,while 循环内的表达式求值为 false,从而中断循环。
循环应如下所示:
while(x < y)
{
int t = *x;
*x++ = *y;
*y-- = t;
}