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

アレサ「ソーラーさん、


int型の配列宣言


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


によって生成される


配列変数


hairetu[0]

hairetu[1]

hairetu[2]


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


hairetu

hairetu+1

hairetu+2

とわかったところで


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

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


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


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


アレサ「・・・」


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


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


配列宣言


int hairetu[3]={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[0]は


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つのお部屋をもち


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


00000000 00000000 00000000 00000011

👆    👆    👆    👆 

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


と格納されています


(^_-)-☆パチっ」


アレサ「


配列変数hairetu[0]

配列変数hairetu[1]

配列変数hairetu[2]

はデータを格納するお部屋を4つもっていても


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

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


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

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


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

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

return 0;


を実行した場合


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


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


配列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で共有
  • はてなブックマークでブックマーク

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る