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