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

アレサ「


#include <stdio.h>


int main(void)

{

int a;

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

return 0;

}


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


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


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


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


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


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


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


printf出力表示します。



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


     

 🍋&aのように&マークがついたもの(アドレス)🍋



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


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


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


メモリに格納された数値データを


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に格納される数値は


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


数値1なら


00000000 00000000 00000000 00000001

 ↑   ↑    ↑    ↑

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


数値256なら


00000000 00000000 00000001 00000000

 ↑   ↑    ↑    ↑

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


のようにです



ですので


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


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


4つのアドレスのにふりわけられて格納されます。


そして


ここで表示された0018FF5Cは変数aを格納するために


順序よく


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


一番数値が小さなものとなります。


つまり


変数aは


0018FF5C

0018FF5D

0018FF5E

0018FF5F


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


(16進数表示において


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


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


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


となっています。)


そして


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


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


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


コンパイル結果に


変数aのアドレスを


0018FF5C

0018FF5D

0018FF5E

0018FF5F

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


それでコンパイル結果は先頭の一番小さい


アドレス 0018FF5Cを表示している・・・と」


アレサ「もし数値1がこのアドレス0018FF5Cの変数aに格納されるなら


00000000 00000000 00000000 00000001

 ↑    ↑    ↑      ↑

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


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



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


では

変数宣言

char b;


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


実験してみましょう。



#include <stdio.h>


int main(void)

{

char b;

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

return 0;

}


コンパイル結果は


0018FF5F


???


あれっ


char型は1バイトだから


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


のはいいとして


int型 変数aのアドレスと


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


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


???


int型 変数aと


char型 変数bに両方とも数値を格納するとき


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


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


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


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


では

変数宣言、初期化

int a=1;

char b=5;

をおこない

変数aと

変数bに数値1を格納した状態で


変数aのアドレスと

変数bのアドレスを

をしらべてみようよ。


変数aのアドレスと

変数bのアドレスが

同じ

0018FF5F


だったら


数値データ

1

5

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



#include <stdio.h>


int main(void)

{

int a=1;

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


char b=1;

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

return 0;

}


Visual Studioの場合

EAZY IDECの場合


コンパイル結果

00EFFB68

00EFFB5F


アレサ「数値が格納されたせいか


変数aと

変数bのアドレスが

違うアドレスに

変化しています」


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


変数aと変数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;

}


コンパイル結果


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;

}


コンパイル結果

0136F984

0136F97B


のように


変数a

変数b

のアドレスが

変化します。


このように

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


数値を格納する変数の

アドレス

変化します。


☆  ☆  ☆

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

作者を応援しよう!

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

応援したユーザー

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