2016-11-07 26 views
0

下列语句执行后,数组的内容是什么?我很困惑。数组内容不会保持不变吗?

#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; 
} 
+6

没有任何反应,因为p小于q。 –

+0

如果您执行此代码并打印数组的最终内容,结果如何? –

+1

为什么不运行这段代码然后打印数组内容? –

回答

1

正如我的评论所述,什么都不会发生,因为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]); 
} 
+0

这是我试图打印出来 – Crowe

+0

的#include 的#define N 10 INT主(){ \t INT一个[N] = {1,2,3,4,5,6,7 ,8,9,10}; \t int * p =&a [0],* q =&a [N-1],temp; \t while(p> q) \t { \t \t temp = * p; \t \t * p ++ = * q; \t \t * q-- = temp; \t} \t printf(“%d”,a [N]); \t return 0; } – Crowe

+0

编辑此问题以获得更多可读性 –

0

如麦说,所提供的while条件实际上是p < q,代码切换第一和最后一个值,然后在第二和倒数第二,等等

说明

指针p设置在数组的开头,q结束。在每一个循环中,在p的值,这是*p,被存储在temp,则在q的值,这是*q,放置在p,然后p递增(即,它移动一个步长向的端部数组)。然后,temp中的值被放在q处,并且q被递减(即,它向阵列的开始移动一步)。

当`p`和`q`相遇时,循环中断。

下一次的建议:打印数组以知道它变成了什么。