- ベストアンサー
ポインタの基礎について
以下の問題を考えたのですが、結果がおかしいようで、どこが間違っていますか?教えて下さい。 以下のプログラムを実行した場合に、各変数の値は(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
- みんなの回答 (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 さんの指摘どおりですよ。分かりましたか? ・以上。おわり。
その他の回答 (3)
- maronii_now
- ベストアンサー率0% (0/8)
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
お礼
ありがとうございます。 もう一度プログラムを作って表示させたらきちんとできました。
- alphion
- ベストアンサー率19% (27/136)
>*p = 8; の処理は?
お礼
すみませんでした。 *p=8; を考慮してみます。
こういうのはどこが予定と違うか書いてくれないと、追うのが面倒なんですよね。。。 p -= 2; *p = 8; ここが無い *(p+3) = 9 (4)の結果に真ん中の行が考慮されていない気がします
お礼
すみません・・・ 結果が違うとしか聞いていないもので その行をもう一度チェックしてプログラムを走らせてみます。
お礼
説明も詳しく書いてくれてありがとうございます。 理解することができました。 再度自分で作ったプログラムは、正確に表示してくれたので、回答と同じ結果になってうれしいです。