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

てんC「ソーラーさん、


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


によって生成される


配列変数


hairetu[0]

hairetu[1]

hairetu[2]


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


hairetu

hairetu+1

hairetu+2


とわかったところで


配列変数


hairetu[0]

hairetu[1]

hairetu[2]


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


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


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


てんC「・・・」


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


てんC「はいっ😊ソーラーさん


配列宣言


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]のアドレスを表示するためには


cout<<hairetu<<"\n";


と記述し


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


cout<<hairetu+1<<"\n";


と記述し

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


cout<<hairetu+2<<"\n";


と記述し


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


ソーラー「そうだね。


どんなふうに


連続したint型の配列変数


hairetu[0]

hairetu[1]

hairetu[2]


アドレスが表示されるか


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


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


#include <iostream>


using namespace std;


int main() {


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


cout<<hairetu<<"\n";

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


cout<<hairetu+1<<"\n";

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


cout<<hairetu+2<<"\n";

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


return 0;


}


ソーラー「ビルドっっと😊」




ビルド実行結果


00CFFCAC

00CFFCB0

00CFFCB4


ソーラー 「どうやら


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]は


00CFFCACを先頭に


00CFFCAC

00CFFCAD

00CFFCAE

00CFFCAF


のアドレス番号の

4つのお部屋をもち


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


00000000 00000000 00000000 00000001

👆    👆    👆    👆 

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


と格納されています


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


                  solarplexussより)


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


は00CFFCB0を先頭に


00CFFCB0

00CFFCB1

00CFFCB2

00CFFCB3


のアドレス番号がついた

4つのお部屋をもち


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


00000000 00000000 00000000 00000010

👆    👆    👆    👆 

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


と格納されています


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


は00CFFCB4を先頭に


00CFFCB4

00CFFCB5

00CFFCB6

00CFFCB7


のアドレス番号の

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


てんC「

配列変数hairetu[0]

配列変数hairetu[1]

配列変数hairetu[2]

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


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


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


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


お部屋のアドレスは


00CFFCAC

00CFFCAD

00CFFCAE

00CFFCAF

00CFFCB0

00CFFCB1

00CFFCB2

00CFFCB3

00CFFCB4

00CFFCB5

00CFFCB6

00CFFCB7


となってるよ


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


先頭の00CFFCACが表示されたよね


そしてなおかつ


アドレス00CFFCACは


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


00CFFCAC

00CFFCAD

00CFFCAE

00CFFCAF

00CFFCB0

00CFFCB1

00CFFCB2

00CFFCB3

00CFFCB4

00CFFCB5

00CFFCB6

00CFFCB7


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


つまり


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


hairetu[0]の


アドレス00CFFCACは


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


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


てんC「確かに


cout<<hairetu<<"\n";


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


を実行すれば


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


配列hairetuは


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




🐦  🐦



実際に


cout<<hairetu<<"\n";ってかくと


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


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


                  solarplexussより

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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