計算機には、主メモリが存在する 大学から貸与されている PC の場合は、 8 G byte のメモリが入っている 1 byte ( 8 bit ) には 0 〜 255 (2^8=256 通りのうちの一つ)までの整数値を一つだけ記録できる メモリには、 情報が記録できる 情報取り出す事ができる !! C 言語の「変数」と同じ性質 (結論からいうと..) 「変数」は、この「メモリのセル」に名前をつけたもの !! C 言語が「強力(低レベル)」 !! この要因の一つは、「メモリ」が「直接」操作できる [二進数] 1 byte = 8 bit -> 8 個の bit がある bit -> 2 つのうちの一つを記録する量 (Yes/No, 真/偽, 女性/男性, 表/裏, 晴れ/雨, 上/下, 善/悪.., ) 0/1 -> 0 と 1 のいずれか一方からなる 1 桁の並び byte -> 0/1 のいずれからなる 8 桁の並び 00000000 0 00000001 1 00000010 2 00000011 3 ... 11111110 11111111 255 --------------- 2^8 256 00000000 = 0*2^7+0*2^6+0*2^5+0*2^4+0*2^3+0*2^2+2^1*0+2^0*0 = 0 00000001 = 0*2^7+0*2^6+0*2^5+0*2^4+0*2^3+0*2^2+2^1*0+2^0*1 = 1 00000011 = 0*2^7+0*2^6+0*2^5+0*2^4+0*2^3+0*2^2+2^1*1+2^0*1 = 0 + 0+ 0+ 0+ 0+ 0+ 2+ 1 = 3 11111111 = 1*2^7+1*2^6+1*2^5+1*2^4+1*2^3+1*2^2+2^1*1+2^1*1 = 128 + 64+ 32+ 18+ 8+ 4+ 2+ 1 = 255 -> 0/1 の並び表現された bit 列は、2 進数の数とみなせる 1 00000001 (1) +) 00000001 (1) -------------- 00000010 (2) 1111111 11111111 (255) +) 00000001 (1) -------------- 100000000 ^ 9 bit 目 -> すてられる -------------- 00000000 (0) ( 8 bit 内に収まらないので、オーバーフローする) # 二進数という「コーディング」 # on/off の並びで、整数値が表現できる # コンピュータが「数」を記録できる理由 # 電気で、on/off が表現できるから メモリ(セル)と、「(C 言語の)変数」との関係 C 言語の「変数」は、 メモリの(その変数の型のサイズの個数の連続した)セルに対応 # cf. 「型のサイズ」は「sizeof(型)」で得られる byte 数 # 特に、sizeof(char) == 1 ## 話を簡単にするために char 型の変数だけを考える C 言語 計算機の実装 変数 メモリ +-------+ 0 | | +-------+ 1 | | +-------+ | | +-------+ | | ... | | +-------+ cvar <-> 7310651e| | +-------+ dvar <-> 7310651f| | +-------+ | | +-------+ | | ... | | +-------+ | | +-------+ fff...f | | +-------+ C 言語 "abc" <-> { 'a', 'b', 'c', '\0' } sizeof ( "abc" ) = 4 "abc" は、連続した 4 つのセルで表現されている メモリ | | ... | | +-------+ "abc" <-> 400678 | 'a' | +-------+ "bc" <-> 400679 | 'b' | +-------+ "c" <-> 40067a | 'c' | +-------+ "" <-> 40067b | '\0'| +-------+ | | +-------+ | | ... | | +-------+ [中間のまとめ] メモリモデル 1 byte の情報が記録できるセルがあり。 それが並んだものがメモリ それぞれのセルには、番地(アドレス)がついている セルの情報は、アドレスを利用して参照・変更できる 個々のセルは、独立していて、char 型の変数と同じ振る舞いをする ! 実は話は逆で、セルの性質が、C 言語の char 型の変数の振る舞い決定している C 言語の変数とメモリモデル C 言語の変数は、そのサイズの個数のセルに対応している 変数のアドレス(=変数に対応したセルのアドレス)が得られる この変数のアドレスを利用して、セル(=変数)値が操作できる オブジェクト指向 | class (method) | 手続き型言語 | | | (アクセス制限) | C 言語の変数 | | | | ポインタ (変数名) アセンブラ | | | | | (直接) | | | 機械語 | 計算機のメモリ (番地とセル) sample-006.c 文字列がアドレスをもっている(複数のセルに対応しているから) 文字列は文字配列 配列の名前 -> 値をもつ -> 配列名は、アドレス(番地)だった => アドレスは「値」なので、関数の引数や、値にできる 「&」は、変数名から、その変数に対応したセルのアドレスを求める scanf で、なぜ、読み込んだ値を変数に代入するために、 変数名の前に「&」を付けた理由 「&」をつけることにより、変数のアドレスが計算される アドレスは値なので、scanf 関数に渡すことができる scanf は、変数のアドレスを利用して、変数値を変更 アドレスを利用して変数の値が変更できる => すごく、気持ちが悪い現象(自分のしらない所で変数の値が書き換わる可能性がある) => すごく、「強力」 (中間まとめ) (1 限の復習) メモリのセルがあって、変数は、セルに対応 変数の値を操作する場合、アドレスが解ればよい (2 限の復習) 変数から & を使って、変数のアドレスが取り出せる 変数アドレスから * をつかって、変数(に対応したセル)を操作できる * と & は逆演算になっている scanf の謎( 値を設定する変数には、必ず「&」を付ける)わかった。