簡體   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