【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.20035

配列とポインタ
投稿者---ぽてち(2005/02/17 01:18:05)


配列とポインタを勉強していたときに、次のようなプログラムがあったのですが、表示される結果が理解できません。
ptrに格納されている値が指す場所の値に2を足し、それを配列arとかけていくという流れなのかなと思ったのですが・・・

一端、for文を削除して実行してみたのですが、ptrに格納されている値が指す場所の値は同じ結果でした。ptr2は違う結果でした。

どのように値が変化していっているのか、ご教授願えないでしょうか。

#include <stdio.h>


/*    プロトタイプ宣言    */
void main(void);


void main(void)
{
        short ar[][10] = {
                {10,9,8,7,6,5,4,3,2,1},
                {20,19,18,17,16,15,14,13,12,11},
                {30,29,28,27,26,25,24,23,22,21},
        };

        short *ptr;
        short *ptr2;
        int m;
        int i;
        int j;

        ptr = &ar[0][0];
        ptr2 = &ar[1][5];

        
        scanf("%d",&m);
        

        /*    処理    */  
        for(i=0;i<3;i++){
                for(j=0;j<10;j++){
                        ar[i][j] *= (*ptr + 2);
                }
        }
        

        /*    このような処理の結果は理解できる
        ar[2][0] *= 10;
        ptr += 19;
        ptr2 += 4;
        *ptr2 += 25;

        */
        
    
        /*    結果表示    */
        printf("ptrの値  = 0x%.2x\n",ptr);
        printf("ptr2の値 = 0x%.2x\n",ptr2);
        printf("ptrの値  = %d\n",*ptr);
        printf("ptr2の値 = %d\n",*ptr2);
}





私の開発環境はXP、Visual C++6.0です。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:配列とポインタ 20036 Craft 2005/02/17 02:39:02


No.20036

Re:配列とポインタ
投稿者---Craft(2005/02/17 02:39:02)


>配列とポインタを勉強していたときに、次のようなプログラムがあったのですが、表示される結果が理解できません。
>
>どのように値が変化していっているのか、ご教授願えないでしょうか。

どう表示されているのか不明ですが、*ptrの値=120、*ptr2の値=1830 が表示されたものと思われます。
なぜこの結果になるかを書きます。
        ptr = &ar[0][0];
        ptr2 = &ar[1][5];

この2つの文の実行により、
ptr にはar[0][0]へのポインタ、ptr2には、ar[1][5]へのポインタが入ります。

続いて、
        for(i=0;i<3;i++){
                for(j=0;j<10;j++){
                        ar[i][j] *= (*ptr + 2);
                }
        }

このfor文ですが、代入文を分解すると、
 ar[i][j] = ar[i][j] * (*ptr + 2);
のようになります。
*ptr は ar[0][0]へのポインタなので、i=0,j=0のときの代入は、
 ar[0][0] = ar[0][0] * (ar[0][0] + 2);
と等価です。

そのため、i=0,j=0の代入が終了すると、
 ar[0][0] = 10 * (10+2) = 120
となります。
代入が終わったあとの *ptr の値ですが、ptrへの操作をしていないので、a[0][0]のポインタのままです。

以後ループが継続しますが、ar[0][0]への代入はこれ以後に発生しないため、*ptr の示す値は、ar[0][0] の値、すなわち 120 となります。

同様に、*ptr2 の値は、ar[1][5]の値を示していますので、
i=1,j=5のときに、
 ar[1][5] *= (*ptr + 2);
であるので、
 ar[1][5] = ar[1][5] * (ar[0][0] + 2);
となり、
 ar[1][5] = 15 * (120 + 2) = 1830
となります。
*ptrの示す値は、i=0,j=0のときにar[0][0]が120に更新されているため、120となっています。

ar[1][5]も以後かわらないので、結果として、*ptr = 120, *ptr2 = 1830 となります。

参考までに、for実行時の値の動きを掲示しておきます。
ar[0][0] =  120   (10 * (10 + 2))    *ptr1 = 10 -> 120, *ptr2 = 15
ar[0][1] = 1098   ( 9 * (120 + 2))   *ptr1 = 120, *ptr2 = 15
ar[0][2] =  976   ( 8 * (120 + 2))   *ptr1 = 120, *ptr2 = 15
ar[0][3] =  854   ( 7 * (120 + 2))   *ptr1 = 120, *ptr2 = 15
ar[0][4] =  732   ( 6 * (120 + 2))   *ptr1 = 120, *ptr2 = 15
ar[0][5] =  610   ( 5 * (120 + 2))   *ptr1 = 120, *ptr2 = 15
ar[0][6] =  488   ( 4 * (120 + 2))   *ptr1 = 120, *ptr2 = 15
ar[0][7] =  366   ( 3 * (120 + 2))   *ptr1 = 120, *ptr2 = 15
ar[0][8] =  244   ( 2 * (120 + 2))   *ptr1 = 120, *ptr2 = 15
ar[0][9] =  122   ( 1 * (120 + 2))   *ptr1 = 120, *ptr2 = 15
ar[1][0] = 2440   (20 * (120 + 2))   *ptr1 = 120, *ptr2 = 15
ar[1][1] = 2318   (19 * (120 + 2))   *ptr1 = 120, *ptr2 = 15
ar[1][2] = 2196   (18 * (120 + 2))   *ptr1 = 120, *ptr2 = 15
ar[1][3] = 2074   (17 * (120 + 2))   *ptr1 = 120, *ptr2 = 15
ar[1][4] = 1952   (16 * (120 + 2))   *ptr1 = 120, *ptr2 = 15
ar[1][5] = 1830   (15 * (120 + 2))   *ptr1 = 120, *ptr2 = 15 -> 1830
ar[1][6] = 1708   (14 * (120 + 2))   *ptr1 = 120, *ptr2 = 1830
ar[1][7] = 1586   (13 * (120 + 2))   *ptr1 = 120, *ptr2 = 1830
ar[1][8] = 1464   (12 * (120 + 2))   *ptr1 = 120, *ptr2 = 1830
ar[1][9] = 1342   (11 * (120 + 2))   *ptr1 = 120, *ptr2 = 1830
ar[2][0] = 3660   (30 * (120 + 2))   *ptr1 = 120, *ptr2 = 1830
ar[2][1] = 3538   (29 * (120 + 2))   *ptr1 = 120, *ptr2 = 1830
ar[2][2] = 3416   (28 * (120 + 2))   *ptr1 = 120, *ptr2 = 1830
ar[2][3] = 3294   (27 * (120 + 2))   *ptr1 = 120, *ptr2 = 1830
ar[2][4] = 3172   (26 * (120 + 2))   *ptr1 = 120, *ptr2 = 1830
ar[2][5] = 3050   (25 * (120 + 2))   *ptr1 = 120, *ptr2 = 1830
ar[2][6] = 2928   (24 * (120 + 2))   *ptr1 = 120, *ptr2 = 1830
ar[2][7] = 2806   (23 * (120 + 2))   *ptr1 = 120, *ptr2 = 1830
ar[2][8] = 2684   (22 * (120 + 2))   *ptr1 = 120, *ptr2 = 1830
ar[2][9] = 2562   (21 * (120 + 2))   *ptr1 = 120, *ptr2 = 1830




この投稿にコメントする

削除パスワード

No.20054

Re:配列とポインタ
投稿者---ぽてち(2005/02/17 20:10:31)


Craftさんありがとうございます。
書いてくださった内容を読むとよく理解できました。
ほんとうにありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧