• ベストアンサー

ポインタの基礎について

以下の問題を考えたのですが、結果がおかしいようで、どこが間違っていますか?教えて下さい。 以下のプログラムを実行した場合に、各変数の値は(1)~(4)の時点で順次どのような値になっているか。 ただし、32bit処理系で実行しているものとし、n[0]、n[1]、・・・は夫々0x1000番地、0x1004番地、・・・に存在するものとする。 int n[7] = {0,1,2,3,4,5,6}; int *p; p = &n[0]; *p = 5; /* (1)この時点で、pの値とn[0]~n[6]の各値は何か?*/ p++; *p = 6; /* (2)この時点で、pの値とn[0]~n[6]の各値は何か?*/ p = &n[5]; *p = 7; /* (3)この時点で、pの値とn[0]~n[6]の各値は何か?*/ p -= 2; *p = 8; *(p+3) = 9 /* (4)この時点で、pの値とn[0]~n[6]の各値は何か?*/ これがわたしの考えた回答です↓ (1)0022FF50 5, 1, 2, 3, 4, 5, 6 (2)0022FF54 5, 6, 2, 3, 4, 5, 6 (3)0022FF64 5. 6, 2, 3, 4, 7, 6 (4)0022FF5C 5, 6, 2, 3, 4, 7, 9

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★解析 (1)p = &n[0]; →[0022FF50] 「0」, 1 , 2 , 3 , 4 , 5 , 6 (2)*p = 5;   →[0022FF50] <5>, 1 , 2 , 3 , 4 , 5 , 6 ←(1)の時点 (3)p++;     →[0022FF54] 5 , 「1」, 2 , 3 , 4 , 5 , 6 (4)*p = 6;   →[0022FF54] 5 , <6>, 2 , 3 , 4 , 5 , 6 ←(2)の時点 (5)p = &n[5]; →[0022FF64] 5 , 6 , 2 , 3 , 4 , 「5」, 6 (6)*p = 7;   →[0022FF64] 5 , 6 , 2 , 3 , 4 , <7>, 6 ←(3)の時点 (7)p -= 2;   →[0022FF5C] 5 , 6 , 2 , 「3」, 4 , 7 , 6 (8)*p = 8;   →[0022FF5C] 5 , 6 , 2 , <8>, 4 , 7 , 6 ←ここが質問の間違い箇所 (9)*(p+3) = 9 →[0022FF5C] 5 , 6 , 2 , 「8」, 4 , 7 , <9>←(4)の時点 ●解説 ・上記の 「」 で囲った部分が、ポインタ(p)の位置を表します。 ・上記の <> で囲った部分が、ポインタ(p)で変更した場所を表します。 ・それで、どこが間違っていたかというと、(8)番号の 8 を忘れましたね。 ・回答者 No.1、No.2 さんの指摘どおりですよ。分かりましたか? ・以上。おわり。

xiamei723
質問者

お礼

説明も詳しく書いてくれてありがとうございます。 理解することができました。 再度自分で作ったプログラムは、正確に表示してくれたので、回答と同じ結果になってうれしいです。

その他の回答 (3)

回答No.3

int n[7] = {0,1,2,3,4,5,6}; int *p; p = &n[0]; *p = 5;←n[0]=5 /* (1)この時点で、pの値とn[0]~n[6]の各値は何か?*/ 5,1,2,3,4,5,6 p++; *p = 6;←n[1]=6 /* (2)この時点で、pの値とn[0]~n[6]の各値は何か?*/ 5,6,2,3,4,5,6 p = &n[5]; *p = 7;←n[5]=7 /* (3)この時点で、pの値とn[0]~n[6]の各値は何か?*/ 5,6,2,3,4,7,6 p -= 2; *p = 8;←n[3]=8 *(p+3) = 9←n[6]=9 /* (4)この時点で、pの値とn[0]~n[6]の各値は何か?*/ 5,6,2,3,4,7,9

xiamei723
質問者

お礼

ありがとうございます。 もう一度プログラムを作って表示させたらきちんとできました。

  • alphion
  • ベストアンサー率19% (27/136)
回答No.2

>*p = 8; の処理は?

xiamei723
質問者

お礼

すみませんでした。 *p=8; を考慮してみます。

noname#96023
noname#96023
回答No.1

こういうのはどこが予定と違うか書いてくれないと、追うのが面倒なんですよね。。。 p -= 2; *p = 8;   ここが無い *(p+3) = 9 (4)の結果に真ん中の行が考慮されていない気がします

xiamei723
質問者

お礼

すみません・・・ 結果が違うとしか聞いていないもので その行をもう一度チェックしてプログラムを走らせてみます。

関連するQ&A