[英]I'm confused by this. Won't the array contents stay the same?
执行以下语句后,数组的内容是什么?
#include <stdio.h>
#define N 10
int main() {
int a[N] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *p = &a[0], *q = &a[N - 1], temp;
while (p > q)
{
temp = *p;
*p++ = *q;
*q-- = temp;
}
printf("%d", a[N]);
return 0;
}
如我的评论所述,什么都不会发生,因为p
小于q
。
如果将while循环更改为while (p <= q)
,则将颠倒数组的顺序。
您将第一个元素( p
)放在temp
。
然后,您将最后一个元素( q
)放在首位( p
)。
然后增加p
,使其指向第二个元素。
然后,在最后一个元素中写入temp
。 并减小q
,使其指向倒数第二个元素。 再次执行此操作,直到p
大于或等于q
为止。
编辑:您的问题是您的打印语句。 您只需使用a[N]
将元素打印在数组的最后一个元素之后。 您的数组是从a[0]
到a[9]
。 通过读取a[10]
您可以调用未定义的行为,因为它不是数组的一部分。 所以你得到一个随机数。
您会想要这样的东西。
for (int i = 0; i<N;i++)
{
printf("a[%d] = %d\n",i,a[i]);
}
如Mak所说,假设while
条件实际上是p < q
,则代码将第一个和最后一个值切换,然后将第二个和倒数第二个切换,依此类推。
说明
指针p
设置在数组的开头, q
设置在结尾。 在每个循环中,将p
处的值*p
存储在temp
,然后将q
处的值*q
放入p
,然后p
递增(即,它向末尾移动一步)数组)。 然后,将temp
的值放在q
,并将q
减1(即,它向数组的开头移动一步)。
当“ p”和“ q”相遇时,循环中断。
下一次建议:打印阵列以了解阵列的状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.