2016-11-07 8 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

私のコメントで述べたように、pqより小さいので、何も起こりません。

whileループをwhile (p <= q)に変更すると、配列の順序が逆になります。

最初の要素(p)をとり、tempに入れます。

次に、最後の要素(q)を置き、最初の場所(p)に配置します。

次に、pを増分して2番目の要素を指します。

その後、最後の要素にtempと書きます。 qを減らし、最後の要素の2番目を指すようにします。 pq以上になるまでこれを再度実行してください。

編集: あなたの問題はあなたのprintステートメントにあります。 a[N]を使って、配列の最後の要素の後に要素を出力するだけです。あなたの配列はa[0]からa[9]です。 a[10]から読み取ると、配列の一部ではないため、未定義の動作が呼び出されます。だからあなたは乱数を得る。

このようなものが必要です。

+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一方(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提供される、コード等、最初と最後の値は、第2と最後のための第2スイッチ

説明

ポインターpは配列の先頭に設定され、末尾にはqが設定されます。すべてのループで、*pあるpの値が、次に*qあるqの値が、pで置かれ、tempに格納され、その後pがインクリメントされる(すなわち、それはの終わりに向かって一歩移動しますアレイ)。その後、tempの値はqになり、qはデクリメントされます(つまり、配列の先頭に向かって1ステップ移動します)。

`p`と` q`が出会うと、ループが壊れます。

次回のアドバイス:アレイの内容を確認して、その内容を確認してください。