#pragma twice

KAB-studio > プログラミング > #pragma twice > 052 Version 4.02 メモリを見よう!

#pragma twice 052 Version 4.02 メモリを見よう!

前のページへ 表紙・目次へ 次のページへ

 Version 4.02
メモリを見よう!

さて、今回から【変数】ってものを徹底的に見ていきます
変数って、 int i とかして、数字入れたりするのでしょ? あとクラス
とか
そう。でもそれは〈見た目〉。本当の姿は違うのです
うー、なんか難しそ
難しいかどうか、見ていきますか。えっと、まず次の関数


void Address()
{
    char ch = 1;
    TRACE( "%d, %X\n", ch, &ch );
}


こんまえ教えてもらったみたいに、名前空間で囲んだりすればいいんだよ

そう、そのあとハンドラから呼べばいいわけ
んじゃビルドして実行

1, 64F530

む、後ろのは〈16進数〉ってヤツだよね
そうそう。じゃ、ひとつずつ見ていこうか
 まず char ってなに?
型のひとつで、 int の小さい版。 int 型の変数には大きな数字が入れら
れるけど、 char 型の変数には大きな数字が入らない
数字入れるのには変わりないってことね。数字って、どんくらい?
 -128 から 127 の間の数字しか、 char 型変数には入らないから
うわ、少なっ! これじゃ計算機には使えないね
ちなみに char 型に限らず、この〈値の範囲〉は OS によって変わってく
るから注意してね。これからの話は、今のウィンドウズで Visual C++ 使っ
た場合ってことで
うん、ウィンドウズでしかアプリ作る気ないしー
話を戻すと、 char 型変数 ch を作って 1 を入れます
数字入るんだからこれでいいんだね
次に TRACE() で ch の中身とアドレスを見ます
あ、 1 って ch に入れたのだね。……でもその次のアドレスってなに? 
& ってなに?
これが今回のミソ。えっと、 TRACE() の次の行の } の行にブレークポイ
ントセットして
はーい。手のひらマークっと。んで実行、マークのとこで止まったよ
アウトプットにどう出てる?
さっきと同じ、 1, 64F530 だよ
この  64F530 の数字は、常に同じとは限らないから、確認しておいてね。
さて、次に【メモリウィンドウ】を表示します
メモリウィンドウ?
そう。メニューの【表示】−【デバッグ ウィンドウ】−【メモリ】を選
んで
ぽちっと
 新たなウィンドウが表示される。一番上に【アドレス】とエディットコン
トロール、その下に ? の嵐。
なんかまたわけ分かんないのが
これは〈メモリ〉の中を表示するウィンドウです
そのまんま。……って、これが、パソコンの中に入ってるあのメモリの中
なの?
実際にはちょっと違うんだけど、ま、そう考えていいかな。メモリには、
パソコンの色々な情報を書き込んで、必要なときに読み取ることができます
うんうん
ってことは、変数も、このメモリ上にあるってこと
変数ってことは、 ch とかが?
そういうこと。では探してみましょう!
はーい!! ……って、どーやって探すの。なんかすごーく広いみたいな
んだけど、このメモリって
そこで &ch の値が役立ちます!
 &ch の値って、さっきの 64F530 のこと?
そう。変数の頭に & を付けると〈変数のアドレス〉が取得できます
アドレスって住所だよね。あ、メモリの住所!
そういうこと。変数はメモリに置かれてるでしょ。その位置が〈アドレス〉
で、アドレスを見るためのが & ってこと
はー、ってことは 64F530 って場所に ch があるんだ
そこで、メモリウィンドウの上のエディットボックスに 0x00000000 って
あるでしょ。それを 0x0064F530 ってしてリターン
そうやって直接アドレスを指定できるんだ。……貼り付けできない〜
 Ctrl + v でできるよ
あ、ホントだ。んでリターン
 メモリウィンドウの下の欄の一番左上が 0064F530 になる。そのすぐ右隣
が 01 となっている。
この 01 って書かれてるところが、 ch に割り当てられた領域
こ、これが……ってことは、 ch を 2 にしたら 02 に、 3 にしたら 03 

なるよ。この関数試してみて


void Counting()
{
    char ch = 0;
    for( int iF1 = 0; iF1 < 20; iF1++ )
    {
        TRACE( "%d, %X, %X\n", ch, ch, &ch );
        ++ch; // ここにブレークポイント。
    }
}


 for って〈繰り返し〉だよね
そう。 ch を 0 からひとつずつ増やすっていうプログラム。えっと、さ
っきと同じように TRACE() の次の行に
ブレークポイントね。んでビルドして実行!

0, 0, 64F530

アドレスはさっきと同じだから、メモリも同じとこ見ればいいかな
ねー、なんで今度は ch の中身ふたつも表示してるの?
最初のは10進、次のは16進表示
あー、 %d が10進で %X が16進だったもんね、確か
って、さっきアドレス表示したときに %X 使ったでしょ
そういえば……で、今の 0x0064F530 は 00 。そっか、 ch が0だもんね
で【実行】ボタンを押せば
押すとどうなるんだっけ
ブレークポイントか外れて普通に進むけど、 for ループの中だからまた
ブレークポイントに引っかかるんだ。で……

1, 1, 64F530

 ch が1増えた。アドレスは変わんないんだね
一度作った変数は移動しないからね。で
あ、 0x0064F530 は 01 になってる!
この部分赤くなってるでしょ。赤くなってるのは〈値が変わった〉って意

じゃーどんどん進めてくと…… ch もひとつずつ増えて、 03 、 04 って
増えてくんだー
あ、 ch が 9 になったら止めて
うん止めた
そしたらひとつ進めて
ほい

10, A, 64F530

あ、 A だって。これが16進数なんだっけ
そう。16進数は0〜16までをヒトケタで表示します。だから10以上
はアルファベットのA〜Fね
ほほう。あ、メモリの方も 0A ってなってる
つまりメモリウィンドウは16進数で表示するってこと
それ確認するために、 ch 10進と16進両方表示したの?
そゆこと。そのままFまで進めて
16進でFだと10進で15なんだね
この辺は憶えるしかないかな
 F-15 イーグルみたいな?
なにそれ
……で、Fまで進めたら?
メモリの方 0F になってるでしょ
なってる
ひとつ進めると
 10 になった
つまり一桁上がったってことだね
あ、左っかわが10の位なんだ
16進数だから16の位かなぁ。だからもうひとつ増やして
 11 。10進数だと17
16の位が1だから16、1の位が1だから1、足して17
や、ややこしい……
ちなみにウィンドウズのアクセサリに入ってる【電卓】でも16進数の計
算ができるから、複雑なのはこれ使った方がいいかな
んでそのまま進めると……あ、終わっちゃった
 for で20回しかループしてないからね。さて
さて?
メモリの 0x0064F530 のまわり、16進数2桁一組でいっぱい並んでるで
しょ
うん、並んでる
まず、メモリはこの2桁一組をひとつのセットとして考えてください
ひとつのセットねぇ
 0x0064F530 が、さっき 01 とかから増えてた1マス。その右隣は
0x0064F531 、1行上の右端……〈フ〉っていうのは違うよ、16進数で表
示されているところは 0x0064F52F ね
あれ、ってことはこの升目って、縦横で並んでるんじゃなくて、1列だけ
ずーっと並んでるってこと?
そゆこと。〈アドレス〉に 0x0064F52F って入れてリターンすれば、ひと
つずれるから分かると思うよ
ほーっ、アドレスはこの1マスのナンバーなのね
メモリ上には 0x00000000 から 0xFFFFFFFF までのマス目があるってこと
だね
そう考えるとすごいね……
で、変数を作るときには、プログラムが自動的に〈このマスからこのマス
まで、変数 iF1 の領域ね!〉っていうふうにメモリの1部分を確保します
それって自動的にしてくれてるの?
こういうのを自分でやると大変だからね。確保するマス目の数だけど、 
char は1マス、 int は4マスね
それって char には大きい数が入らない、ってのと関係ある?
そういうことだね。これは次回。最後に!
最後に?
このメモリのアドレスは〈今実行しているアプリだけのもの〉だから
どゆこと?
 つまり、あるアプリの 0x0064F530 と、他のアプリの 0x0064F530 には
別の値が入ってるってこと。アプリごとに独立してるってことね?
え!? だって、メモリって……
そう、ハードウェアとしてのメモリは全部で統一されてるけど、アプリは
この〈仮想アドレス〉にしか触れられません
なんで?
だって、あるアプリの変数を、他のアプリから書き換えたりしたらまずい
でしょ
あ、そういうことはできないようになってるんだ
そ。だから、 0x00000000 から 0xFFFFFFFF のマス目が、アプリひとつひ
とつに与えられるってことだね
やっぱすごい……

/*
    Preview Next Story!
*/
なんてゆーか、パズルっぽいよね
実際パズルだね。イメージさえ掴めれば難しくないでしょ?
パズル解くのは十分難しいって
そりゃそうか
というわけで次回
< Version 4.03 トランジスタスイッチ >
につづく!!
でも思ってたほどは難しくないかも
すごく難しかったら、火美ちゃんにもできる! なんて言わないよ
ほほーう、水希ちゃんにも理解できるんだから難しくないはずよね
ほほーう
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。