配列に数値を格納した場合の配列や配列変数のアドレスはどうなっているのでしょうか?調べてみます。

アレサ「ソーラーさん、


配列int hairetu[]={1,2,3};


によって生成される


配列変数


hairetu[0]

hairetu[1]

hairetu[2]


のアドレスを格納しているポインタ変数が


hairetu

hairetu+1

hairetu+2

とわかったところで


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

のアドレスをしらべてみましょう。


ここでおさらいすると・・・」


ソーラー「お皿洗いすると・・・」


アレサ「・・・」


ソーラー「・・・つづきをお願い・・・」


アレサ「はいっ😊ソーラーさん


配列宣言


int hairetu[]={1,2,3};


が行われた時点で


ポインタ変数hairetuにはすでに


整数値1を格納したhairetu[0]のアドレス


&hairetu[0]が格納されていました。


ポインタ変数hairetu+1にはすでに


整数値2を格納したhairetu[1]のアドレス


&hairetu[1]が格納されていました。


ポインタ変数hairetu+2にはすでに


整数値3を格納したhairetu[2]のアドレス


&hairetu[2]が格納されていました。


ですのでhairetu[0]のアドレスを表示するためには


printf(%p,hairetu);


と記述し


ですのですのでhairetu[1]のアドレスを表示するためには


printf(%p,hairetu+1);


と記述し


ですのですのですのでhairetu[2]のアドレスを表示するためには


printf(%p,hairetu+2);


と記述し


命令文を実行すればよいわけですね。ソーラーさん」


ソーラー「そうですのやね、アレサ


どんなふうに


連続したint型の配列変数


hairetu[0]

hairetu[1]

hairetu[2]



アドレスが表示されるか


ちょっと実験するのもいいかもしれない。


プログラムを構成して・・」


#include <stdio.h>


int main(void){


int hairetu[]={1,2,3};


printf("%p\n",hairetu);

/*(hairetu[0]のアドレスを表示します)*/


printf("%p\n",hairetu+1);

/*(hairetu[1]のアドレスを表示します)*/


printf("%p\n",hairetu+2);

/*(hairetu[2]のアドレスを表示します)*/

return 0;

}


ソーラー「コンパイルっっと😊」


コンパイル結果

0019FF4C

0019FF50

0019FF54


ソーラー 「どうやら

hairetu[0]

hairetu[1]

hairetu[2]

のアドレスは隣同士のようだね。



0019FF50の次は0019FF51じゃないかって?



数値1は


int型(4バイト)の


配列変数hairetu[0]に格納されています


つまり


数値1は4バイトの領域にわたってデータが格納されています。


つまりのつまり

(4バイト=)1バイトのお部屋4つ分にわたって


00000000 00000000 00000000 00000001



データが格納されています。


コンピュータはメモリの1バイトのお部屋ごとにアドレスをつけているので


数値1を格納しているint型の配列変数hairetu[1]は


0019FF4Cを先頭に


0019FF4C

0019FF4D

0019FF4E

0019FF4F


のアドレス番号の

4つのお部屋をもち


数値1のデータは この4つのお部屋にまたがって


00000000 00000000 00000000 00000001

👆    👆    👆    👆 

1バイト 1バイト  1バイト 1バイト


と格納されています



(16進数で0019FF4Fの次の数値は0019FF50となります。


                  solarplexussより)


数値2を格納しているint型の配列変数hairetu[1]


は0019FF50を先頭に


0019FF50

0019FF51

0019FF52

0019FF53


のアドレス番号がついた

4つのお部屋をもち


数値2のデータは この4つのお部屋にまたがって


00000000 00000000 00000000 00000010

👆    👆    👆    👆 

1バイト 1バイト  1バイト 1バイト


と格納されています




数値3を格納しているint型の配列変数hairetu[2]


は0019FF54を先頭に


0019FF54

0019FF55

0019FF56

0019FF57


のアドレス番号の

4つのお部屋をもつことになるんだね(^_-)-☆パチっ」


アレサ「4つのお部屋をもっていても


その先頭のアドレスしか表示されないのですね。」


ソーラー「そうだねぇ~ほんとだね。


配列hairetuに格納されているすべての


お部屋のアドレスは


0019FF4C

0019FF4D

0019FF4E

0019FF4F

0019FF50

0019FF51

0019FF52

0019FF53

0019FF54

0019FF55

0019FF56

0019FF57


となってるよ


hairetu[0]のアドレスをもとめたときは


先頭の0019FF4Cが表示されたよね


そしてなおかつ


アドレス0019FF4Cは


配列hairetuが格納している全アドレス


0019FF4C

0019FF4D

0019FF4E

0019FF4F

0019FF50

0019FF51

0019FF52

0019FF53

0019FF54

0019FF55

0019FF56

0019FF57


の先頭のアドレスになっているよね


つまり


ポインタ変数hairetuに格納されている


hairetu[0]の


アドレス0019FF4Cは


配列hairetuの先頭のアドレスであり


配列hairetuを代表するアドレスといえるんじゃな~い😊かな」


アレサ「確かに


printf("%p\n",hairetu);

/*hairetu[0]に格納されているアドレスを表示する*/


を実行すれば


hairetu[0]のアドレスがわかります


配列hairetuは


hairetu[0]のアドレスのメモリから数値を格納しはじめているのです。」


🐦  🐦


実際に


printf("%p\n",hairetu);ってかくと


hairetu[0]のアドレスを表示しているんだけど


配列hairetuのアドレスを表示していることにもなります


                  solarplexussより

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます