int型の変数aは4バイトの格納容量を持ち1バイトごとにアドレスがつけられています。アドレスは16進数で表されるのでアドレスを表示するには16進数を出力表示する%p出力変換指定子をもちいます 

int型の変数aは4バイトの格納容量を持ちます


また


1バイトごとにアドレスがつけられています。


アドレスは16進数で表されるので


アドレスを表示するには16進数を出力表示する%p出力変換指定子をもちいます 



アレサ「


#include <stdio.h>


int main(void)

{

int a;

printf("%p\n",&a);

return 0;

}


ソーラーさん。 どうです。 


変数aのアドレスを求めるプログラムですね。


結構、簡単な感じがします000111」


ソーラー 「なんかシンプルでかわいいね。


とくに&aの&マークが。」


アレサ 「変数aのアドレスを知るためには


このように変数aに&マークをつけて%p出力変換指定子をもちいて


printf出力表示します。



%p出力変換指定子は変数aに


     

 🍋&aのように&マークがついたもの(すなわち変数aのアドレス)🍋



をprintf出力表示するために用いられています。


アドレスは普通16進数で表される(というルールがある)ので


アドレスを表示するためには


0と1で構成されたメモリに格納された数値データを


16進数に変換して出力表示する%p出力変換指定子を用います。」



ソーラー 「16進数に変換して出力表示する%p出力変換指定子・・・

かわいいね。」


アレサ 「00000111


どうも%p出力変換指定子は


変数のアドレスを表示するときによく使われ


コマンドプロンプト画面に


16進数で数値を出力表示する出力変換指定子のようです。0000000


ですので


アドレスを表示するプログラム

👇

#include <stdio.h>


int main(void)

{

int a;

printf("%p\n",&a);

return 0;

}


のプログラムの実行結果は


0018FF5C


のように16進数表示になります。


私のパソコンではプログラムの実行結果は0018FF5Cと


なりましたが


お手持ちのパソコンによって


このプログラムの実行結果はかわってくるようです。


変数aはint型なので変数aに格納される数値は


2進数で


4バイト(32ビット)の格納領域にわたってメモリに格納されます。


数値1なら


00000000 00000000 00000000 00000001

 ↑   ↑    ↑    ↑

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


数値256なら


00000000 00000000 00000001 00000000

 ↑   ↑    ↑    ↑

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


のようにです



ですので


メモリ1バイト単位ごとにアドレスは付けられているので


int型の変数aに格納される数値データ(32ビット=4バイト)は


4つのアドレスのメモリに振り分けられて格納されます。


今のプログラムの場合


表示されたアドレス番号0018FF5Cは


変数aを構成している(変数aが管理している)


順序よく


ならんでいる4つのお部屋につけられたアドレスのうち


一番数値が小さなものか


一番数値が大きなものか


のどちらかとなっています


つまり


表示されたアドレス番号0018FF5Cが


変数aを構成している(変数aが管理している)


順序よく


ならんでいる4つのお部屋につけられたアドレスのうち


一番数値が小さなものならば


変数aは


0018FF5C

0018FF5D

0018FF5E

0018FF5F


のアドレスをもつ4つのお部屋(メモリ)から成り立っています。


(16進数表示において


0018FF5Cの次におおきい数値は


0018FF5Cに1を足した

0018FF5D


0018FF5Dの次におおきい数値は


0018FF5Dに1を足した

0018FF5E


0018FF5Eの次におおきい数値は


0018FF5Eに1を足した

0018FF5F


となっています。)


そして


変数aのアドレスをもとめると


0018FF5Cだけが表示されます。(^o^)/



表示されたアドレス番号0018FF5Cが


変数aを構成している(変数aが管理している)


順序よく


ならんでいる4つのお部屋につけられたアドレスのうち


一番数値が大きなものならば


変数aは


0018FF5C

0018FF5B

0018FF5A

0018FF59


のアドレスをもつ4つのお部屋(メモリ)から成り立っています。


(16進数表示において


0018FF5Cの次に小さい数値は


0018FF5Cから1を引いた

0018FF5B


0018FF5Bの次に小さい数値は


0018FF5Bから1を引いた

0018FF5A


0018FF5Aの次に小さい数値は


0018FF5Aから1を引いた

0018FF59


となっています。)


そして


変数aのアドレスをもとめると


0018FF5Cだけが表示されます。(^o^)/



ソーラー 「まあ、さすがに


プログラムの実行結果に


変数aのアドレスを


0018FF5C

0018FF5D

0018FF5E

0018FF5F

全部表示するのはおおすぎるかな?


それでプログラムの実行結果は先頭の一番小さい


アドレス 

0018FF5C


(もしくは


先頭の一番大きい


アドレス 

0018FF5C)


を表示している・・・と」


アレサ「もし


変数aの管理しているメモリのアドレスが


0018FF5C

0018FF5D

0018FF5E

0018FF5F


となっていて


数値データ1がこのアドレス0018FF5Cの変数aに格納されるなら


00000000 00000000 00000000 00000001

 ↑    ↑    ↑      ↑

0018FF5F 0018FF5E 0018FF5D 0018FF5C(アドレス番号です)


のようにメモリに格納されます。」



ソーラー「なあるほどぉ そんな仕組みになっているんだね😊


では

変数宣言

char b;


によって作製されたchar型の変数bのアドレスはどうなっているのか


実験してみましょう。



#include <stdio.h>


int main(void)

{

char b;

printf("%p\n",&b);

return 0;

}


ビルド実行結果(Visual Studioの場合)

012FFD40


プログラムの実行結果は

(EAZY IDECの場合)

0018FF5F


???


あれっ


char型の変数は1バイトのデータ格納容量をもっているから


1つのアドレスをもっているはず・・・


のはいいとして


(EAZY IDECの場合)では


int型の変数aのアドレスと(前のエピソードでもアドレスは0018FF5Fと表示されました)


char型の変数bのアドレスが0018FF5Fと重なっている。???


これは大丈夫なのかな・・・


同じメモリを使ってデータを格納していることになるよね


???


int型の変数aと


char型の変数bを作製して


int型の変数a

char型の変数b


に両方とも数値データを格納するとき


データが2重ではいっちゃうのでは?」


アレサ 「1111111000あっ 本当です・・・・


これはどうなっているのかしら?」


ソーラー 「???おもしろいね。アレサ。


では

変数宣言、初期化

int a=1;

char b=5;

をおこない


int型の変数aに数値1

char型の変数bに数値5

を格納した状態で


int型の変数aのアドレスと

char型の変数bのアドレスを


をしらべてみようよ。


int型の変数aのアドレスと

char型の変数bのアドレスが

同じ

0018FF5F


だったら


数値データ

1

5

が同じアドレスに格納されることになっちゃうよね。



#include <stdio.h>


int main(void)

{

int a=1;

printf("%p\n",&a);


char b=5;

printf("%p\n",&b);

return 0;

}


Visual Studioの場合

008FF788

008FF77F


EAZY IDECの場合


プログラムの実行結果

00EFFB68

00EFFB5F


アレサ「

int型の変数a

char型の変数b


に両方とも数値データが格納されたせいか


int型の変数aのアドレス

char型の変数bのアドレスが

違うアドレスに

変化しています」


ソーラー「同じアドレスのメモリに


int型の変数aとchar型の変数bに格納された


数値データが格納されるということはないんだね」



☆  ☆  ☆

ここで

変数bに格納される数値データを

1から

111111111111に変更すると


#include <stdio.h>


int main(void)

{

int a = 1;

printf("%p\n", &a);


char b =111111111111;

printf("%p\n", &b);

return 0;

}


プログラムの実行結果

(EAZY IDECの場合)

012FF8E4

012FF8DB


変数a

変数b

アドレスが変化します。


さらに

同じプログラムを

もう1度実行すると


#include <stdio.h>


int main(void)

{

int a = 1;

printf("%p\n", &a);


char b =111111111111;

printf("%p\n", &b);

return 0;

}


プログラムの実行結果

(EAZY IDECの場合)

0136F984

0136F97B


のように


変数a

変数b

のアドレスが

変化します。


このように


統合開発環境

の仕様

お手持ちのパソコンの使用状況によって


数値データを格納する変数の

アドレス

変化します。


☆  ☆  ☆

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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