繁体   English   中英

我对此感到困惑。 数组内容不会保持不变吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM