天国にいけるC言語入門 ヘキサ構造体 ver3.2128
int型の変数aは4バイトの格納容量を持ち1バイトごとにアドレスがつけられています。アドレスは16進数で表されるのでアドレスを表示するには16進数を出力表示する%p出力変換指定子をもちいます
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
のアドレスが
変化します。
このように
統合開発環境
の仕様
や
お手持ちのパソコンの使用状況によって
数値データを格納する変数の
アドレス
は
変化します。
☆ ☆ ☆
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます