当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/* * 2012/10/05 sample-001.c */ #include <stdio.h> #include "s_print.h" #include "s_memory.h" /* memory モデルを理解するための関数定義 */ /* * */ int main ( void ) { /* * メモリの操作 ( 情報の記録 : set_memory_value_at ) */ set_memory_value_at ( 100, 1 ); /* 100 番地のセルに 1 を記録する */ set_memory_value_at ( 101, 10 ); /* 101 番地のセルに 10 を記録する */ /* * メモリの操作 ( 情報の参照 : get_memory_value_at ) */ s_print_string ( "100 番地のセルに記録されている数値は " ); s_print_int ( get_memory_value_at ( 100 ) ); s_print_string ( " です。\n" ); s_print_string ( "101 番地のセルに記録されている数値は " ); s_print_int ( get_memory_value_at ( 101 ) ); s_print_string ( " です。\n" ); /* * */ return 0; } /* * */
C:\usr\c>sample-001 100 番地のセルに記録されている数値は 1 です。 101 番地のセルに記録されている数値は 10 です。 C:\usr\c>
Download : sample-002.c ( SJIS 版 )
/* * 2012/10/05 sample-002.c */ #include <stdio.h> #include "s_print.h" #include "s_memory.h" /* memory モデルを理解するための関数定義 */ /* * print_memory_value * 指定された address の記憶セルの内容を画面に出力する */ void print_memory_value ( int address ) { s_print_int ( address ); s_print_string ( " 番地のセルに記録されている数値は " ); s_print_int ( get_memory_value_at ( address ) ); s_print_string ( " です。\n" ); } /* * */ int main ( void ) { /* * メモリの参照 : 一度記録した情報は何度でも参照できる */ set_memory_value_at ( 100, 1 ); /* 100 番地のセルに 1 を記録する */ print_memory_value ( 100 ); /* 100 番地のセルの内容を出力 (一度目) */ print_memory_value ( 100 ); /* 二度目 */ print_memory_value ( 100 ); /* 三度目 */ /* * 参照は何度行っても、同じ情報が得られる */ /* * 記憶の破壊 : 新しい情報を記録すると以前の記録は失われる */ set_memory_value_at ( 100, 99 ); /* 100 番地のセルに 99 を記録する */ print_memory_value ( 100 ); /* 100 番地のセルの内容を出力 */ /* * 新しい情報を記憶すると以前の記録された情報は失われる */ /* * 記録は最後のものだけ ( 参照の有無と無関係に最後のものだけを記録 ) */ set_memory_value_at ( 100, 21 ); /* 100 番地のセルに 21 を記録する */ set_memory_value_at ( 100, 22 ); /* 100 番地のセルに 22 を記録する */ set_memory_value_at ( 100, 23 ); /* 100 番地のセルに 23 を記録する */ print_memory_value ( 100 ); /* 100 番地のセルの内容を出力 */ /* * 記録されている情報は最後に記録された物だけ */ /* * */ return 0; } /* * */
C:\usr\c>sample-002 100 番地のセルに記録されている数値は 1 です。 100 番地のセルに記録されている数値は 1 です。 100 番地のセルに記録されている数値は 1 です。 100 番地のセルに記録されている数値は 99 です。 100 番地のセルに記録されている数値は 23 です。 C:\usr\c>
Download : sample-003.c ( SJIS 版 )
/* * 2012/10/05 sample-003.c */ #include <stdio.h> #include "s_print.h" #include "s_memory.h" /* memory モデルを理解するための関数定義 */ /* * print_memory_value * 指定された address の記憶セルの内容を画面に出力する */ void print_memory_value ( int address ) { s_print_int ( address ); s_print_string ( " 番地のセルに記録されている数値は " ); s_print_int ( get_memory_value_at ( address ) ); s_print_string ( " です。\n" ); } /* * */ int main ( void ) { /* * メモリセルの独立性 : 番地の異るセルは独立に振る舞う */ set_memory_value_at ( 100, 1 ); /* 100 番地のセルに 1 を記録する */ set_memory_value_at ( 101, 2 ); /* 101 番地のセルに 2 を記録する */ print_memory_value ( 100 ); /* 100 番地のセルの内容を出力 */ print_memory_value ( 101 ); /* 101 番地のセルの内容を出力 */ /* * 番地が異れば、記録されている情報も異る */ /* * 記憶の独立性 */ set_memory_value_at ( 100, 99 ); /* 100 番地のセルに 99 を記録する */ print_memory_value ( 100 ); /* 100 番地のセルの内容を出力 */ print_memory_value ( 101 ); /* 101 番地のセルの内容を出力 */ /* * 100 番地の情報を書き換えても、101 番地の情報は影響しない */ set_memory_value_at ( 101, 88 ); /* 101 番地のセルに 88 を記録する */ print_memory_value ( 100 ); /* 100 番地のセルの内容を出力 */ print_memory_value ( 101 ); /* 101 番地のセルの内容を出力 */ /* * 逆も真なり */ /* * */ return 0; } /* * */
C:\usr\c>sample-003< sample-003.in 100 番地のセルに記録されている数値は 1 です。 101 番地のセルに記録されている数値は 2 です。 100 番地のセルに記録されている数値は 99 です。 101 番地のセルに記録されている数値は 2 です。 100 番地のセルに記録されている数値は 99 です。 101 番地のセルに記録されている数値は 88 です。 C:\usr\c>
Download : sample-004.c ( SJIS 版 )
/* * 2012/10/05 sample-004.c */ #include <stdio.h> #include "s_print.h" #include "s_memory.h" /* memory モデルを理解するための関数定義 */ /* * print_memory_value * 指定された address の記憶セルの内容を画面に出力する */ void print_memory_value ( int address ) { s_print_int ( address ); s_print_string ( " 番地のセルに記録されている数値は " ); s_print_int ( get_memory_value_at ( address ) ); s_print_string ( " です。\n" ); } /* * */ int main ( void ) { /* * メモリセルの容量 */ set_memory_value_at ( 100, 0 ); /* 100 番地のセルに 0 を記録する */ print_memory_value ( 100 ); /* 100 番地のセルの内容を出力 */ set_memory_value_at ( 100, 100 ); /* 100 番地のセルに 100 を記録する */ print_memory_value ( 100 ); /* 100 番地のセルの内容を出力 */ set_memory_value_at ( 100, 255 ); /* 100 番地のセルに 255 を記録する */ print_memory_value ( 100 ); /* 100 番地のセルの内容を出力 */ /* * 0 〜 255 ならば、記録できる */ /* * メモリセルの容量オーバー */ set_memory_value_at ( 100, 300 ); /* 100 番地のセルに 300 を記録しようとした */ print_memory_value ( 100 ); /* 100 番地のセルの内容を出力 */ /* * 300 は記憶されていない !! * 実は 300 を 256 で割った余り ( 44 ) が記録されている * 256 を越る(オーバーする)情報は捨てられる !! */ /* * */ return 0; } /* * */
C:\usr\c>sample-004 100 番地のセルに記録されている数値は 0 です。 100 番地のセルに記録されている数値は 100 です。 100 番地のセルに記録されている数値は 255 です。 100 番地のセルに記録されている数値は 44 です。 C:\usr\c>
Download : sample-005.c ( SJIS 版 )
/* * 2012/10/05 sample-005.c */ #include <stdio.h> #include "s_print.h" #include "s_variable.h" /* memory モデルを理解するための関数定義 */ /* * */ int main ( void ) { /* * C 言語の変数のメモリモデルによる理解 */ char cvar; /* char 型の変数 cvar の宣言 */ char dvar; /* char 型の変数 dvar の宣言 */ /* * 変数はアドレスをもっている */ s_print_string ( "変数 cvar のアドレスは 16 進数表現で " ); s_print_hex ( get_variable_address( cvar ) ); s_print_string ( " です。\n" ); s_print_string ( "変数 dvar のアドレスは 16 進数表現で " ); s_print_hex ( get_variable_address( dvar ) ); s_print_string ( " です。\n" ); /* * 変数名が異れば、番地も異っている */ /* * 変数をアドレスを利用して参照 */ cvar = 'c'; /* 変数 cvar に、値 'c' を代入 */ dvar = 'D'; /* 変数 Dvar に、値 'D' を代入 */ s_print_string ( "cvar に記録されている文字は " ); s_print_char ( get_variable_value_at ( get_variable_address( cvar ) ) ); s_print_string ( " です。\n" ); s_print_string ( "dvar に記録されている文字は " ); s_print_char ( get_variable_value_at ( get_variable_address( dvar ) ) ); s_print_string ( " です。\n" ); /* * 変数をアドレスを利用して変更 */ set_variable_value_at ( get_variable_address( cvar ), 'X' ); /* 変数 cvar の所に 'X' を記録 */ s_print_string ( "cvar は " ); s_print_char ( cvar ); s_print_string ( " です。\n" ); set_variable_value_at ( get_variable_address( dvar ), 'y' ); /* 変数 dvar の所に 'y' を記録 */ s_print_string ( "dvar は " ); s_print_char ( dvar ); s_print_string ( " です。\n" ); /* * */ return 0; } /* * */
10
C:\usr\c>sample-005< sample-005.in 変数 cvar のアドレスは 16 進数表現で bfa8359f です。 変数 dvar のアドレスは 16 進数表現で bfa8359e です。 cvar に記録されている文字は c です。 dvar に記録されている文字は D です。 cvar は X です。 dvar は y です。 C:\usr\c>
Download : sample-006.c ( SJIS 版 )
/* * 2012/10/05 sample-006.c */ #include <stdio.h> #include "s_print.h" #include "s_variable.h" /* memory モデルを理解するための関数定義 */ /* * */ int main ( void ) { /* * C 言語の文字列のメモリモデルによる理解 */ /* * 文字列はアドレスをもっている */ s_print_string ( "文字列 \"abc\" のアドレスは 16 進数表現で " ); s_print_hex ( get_string_address( "abc" ) ); s_print_string ( " です。\n" ); /* * 文字列の要素をアドレスを利用して参照 */ s_print_string ( "文字列 \"abc\" の先頭の文字は " ); s_print_char ( get_variable_value_at ( get_string_address( "abc" ) ) ); s_print_string ( " です。\n" ); /* * 文字列の要素の二つ目以後を */ s_print_string ( "文字列 \"abc\" の先頭の次の文字は " ); s_print_char ( get_variable_value_at ( get_string_address( "abc" ) + 1 ) \ ); s_print_string ( " です。\n" ); s_print_string ( "文字列 \"abc\" の先頭の次の次の文字は " ); s_print_char ( get_variable_value_at ( get_string_address( "abc" ) + 2 ) \ ); s_print_string ( " です。\n" ); /* * */ return 0; } /* * */
C:\usr\c>sample-006 文字列 "abc" のアドレスは 16 進数表現で 8048dc7 です。 文字列 "abc" の先頭の文字は a です。 文字列 "abc" の先頭の次の文字は b です。 文字列 "abc" の先頭の次の次の文字は c です。 C:\usr\c>
Download : sample-007.c ( SJIS 版 )
/* * 2012/10/05 sample-007.c */ #include <stdio.h> #include "s_print.h" #include "s_variable.h" /* memory モデルを理解するための関数定義 */ /* * */ int main ( void ) { /* * C 言語の変数のメモリモデルによる理解 */ char cvar; /* char 型の変数 cvar の宣言 */ char dvar; /* char 型の変数 dvar の宣言 */ char evar; /* char 型の変数 evar の宣言 */ /* * 変数を並べてて宣言すると (偶然..) アドレスが逆順で連続していた.. */ s_print_string ( "変数 cvar のアドレスは 16 進数表現で " ); s_print_hex ( get_variable_address( cvar ) ); s_print_string ( " です。\n" ); s_print_string ( "変数 dvar のアドレスは 16 進数表現で " ); s_print_hex ( get_variable_address( dvar ) ); s_print_string ( " です。\n" ); s_print_string ( "変数 evar のアドレスは 16 進数表現で " ); s_print_hex ( get_variable_address( evar ) ); s_print_string ( " です。\n" ); /* * 変数をアドレスを利用して参照 */ evar = 'c'; /* 変数 evar に、値 'c' を代入 */ dvar = 'D'; /* 変数 dvar に、値 'D' を代入 */ cvar = '\0'; /* 変数 cvar に、値 '\0' を代入 */ s_print_string ( "evar の所から記録されている文字列は " ); s_print_string ( get_variable_address( evar ) ); s_print_string ( " です。\n" ); /* * アドレス経由で、変数の内容を変更 */ set_variable_value_at ( get_variable_address( evar ) + 1, 'x' ); /* 変数 evar のアドレスの次のアドレスは dvar のアドレスなので.. */ s_print_string ( "evar に記録されている文字は " ); s_print_char ( evar ); s_print_string ( " です。\n" ); /* 結果的に、dvar の内容が書き変わる */ s_print_string ( "dvar に記録されている文字は " ); s_print_char ( dvar ); s_print_string ( " です。\n" ); /* * */ return 0; } /* * */
C:\usr\c>sample-007 変数 cvar のアドレスは 16 進数表現で bfda689f です。 変数 dvar のアドレスは 16 進数表現で bfda689e です。 変数 evar のアドレスは 16 進数表現で bfda689d です。 evar の所から記録されている文字列は cD です。 evar に記録されている文字は c です。 dvar に記録されている文字は x です。 C:\usr\c>
Download : sample-008.c ( SJIS 版 )
/* * 2012/10/05 sample-008.c */ #include <stdio.h> #include "s_print.h" #include "s_variable.h" /* memory モデルを理解するための関数定義 */ /* * */ int main ( void ) { /* * C 言語の変数のメモリモデルによる理解 */ char carray[3]; /* char 型の一次元配列 carray の宣言 (サイズは 3) */ /* 意味的には char carry[2]; -- cvar char carry[1]; -- dvar char carry[0]; -- evar のように考えて良い (cf. sample-007.c) */ /* * 配列の要素のアドレスは連続している事が保証される */ s_print_string ( "変数 carray[2] のアドレスは 16 進数表現で " ); s_print_hex ( get_variable_address( carray[2] ) ); s_print_string ( " です。\n" ); s_print_string ( "変数 carray[1] のアドレスは 16 進数表現で " ); s_print_hex ( get_variable_address( carray[1] ) ); s_print_string ( " です。\n" ); s_print_string ( "変数 carray[0] のアドレスは 16 進数表現で " ); s_print_hex ( get_variable_address( carray[0] ) ); s_print_string ( " です。\n" ); /* * 変数をアドレスを利用して参照 */ carray[0] = 'c'; /* 変数 carray[0] に、値 'c' を代入 */ carray[1] = 'D'; /* 変数 carray[1] に、値 'D' を代入 */ carray[2] = '\0'; /* 変数 carray[2] に、値 '\0' を代入 */ s_print_string ( "carray[0] の所から記録されている文字列は " ); s_print_string ( get_variable_address( carray[0] ) ); s_print_string ( " です。\n" ); /* * アドレス経由で、変数の内容を変更 */ set_variable_value_at ( get_variable_address( carray[0] ) + 1, 'x' ); /* 変数 carray[0] のアドレスの次のアドレスは carray[1] のアドレスなので.. */ s_print_string ( "carray[0] に記録されている文字は " ); s_print_char ( carray[0] ); s_print_string ( " です。\n" ); /* 結果的に、carray[1] の内容が書き変わる */ s_print_string ( "carray[1] に記録されている文字は " ); s_print_char ( carray[1] ); s_print_string ( " です。\n" ); /* * */ return 0; } /* * */
C:\usr\c>sample-008 変数 carray[2] のアドレスは 16 進数表現で bfc77fbf です。 変数 carray[1] のアドレスは 16 進数表現で bfc77fbe です。 変数 carray[0] のアドレスは 16 進数表現で bfc77fbd です。 carray[0] の所から記録されている文字列は cD です。 carray[0] に記録されている文字は c です。 carray[1] に記録されている文字は x です。 C:\usr\c>
Download : sample-009.c ( SJIS 版 )
/* * 2012/10/05 sample-009.c */ #include <stdio.h> #include "s_print.h" #include "s_variable.h" /* memory モデルを理解するための関数定義 */ /* * */ int main ( void ) { /* * */ char carray[3]; /* char 型の一次元配列 carray の宣言 (サイズは 3) */ /* * 配列の要素のアドレスは連続している事が保証される */ carray[0] = 'c'; /* 変数 carray[0] に、値 'c' を代入 */ carray[1] = 'D'; /* 変数 carray[1] に、値 'D' を代入 */ carray[2] = '\0'; /* 変数 carray[2] に、値 '\0' を代入 */ /* +------+ carray[0] | 'c' | <-----+ +------+ | carray[1] | 'D' | +--- "cD" 文字列と同じ "cD"[0] = carray[0] +------+ | => "cD" == carray carray[2] | '\0' | <-----+ +------+ */ s_print_string ( "carray[0] の所から記録されている文字列は " ); s_print_string ( get_variable_address( carray[0] ) ); s_print_string ( " です。\n" ); /* * 配列名は、文字列と同じように扱える */ s_print_string ( "carray が表現している文字列は " ); s_print_string ( carray ); s_print_string ( " です。\n" ); /* * 文字列の一部を変更する事ができる */ carray[1] = 'U'; /* ニ文字目を 'U' に変更 */ s_print_string ( "carray が表現している文字列は " ); s_print_string ( carray ); s_print_string ( " です。\n" ); carray[0] = 'p'; /* 一字目を 'p' に変更 */ s_print_string ( "carray が表現している文字列は " ); s_print_string ( carray ); s_print_string ( " です。\n" ); /* * */ return 0; } /* * */
C:\usr\c>sample-009 carray[0] の所から記録されている文字列は cD です。 carray が表現している文字列は cD です。 carray が表現している文字列は cU です。 carray が表現している文字列は pU です。 C:\usr\c>
Download : sample-010.c ( SJIS 版 )
/* * 2012/10/05 sample-010.c */ #include <stdio.h> #include "s_print.h" /* * */ int main ( void ) { /* * 文字配列の初期化 */ char carray[3] = "AB"; /* carray[0] = 'A'; carray[1] = 'B'; carray[2] = '\0'; */ s_print_string ( "carray[0] は " ); s_print_char ( carray[0] ); s_print_string ( " です。\n" ); s_print_string ( "carray[1] は " ); s_print_char ( carray[1] ); s_print_string ( " です。\n" ); /* * */ return 0; } /* * */
C:\usr\c>sample-010 carray[0] は A です。 carray[1] は B です。 C:\usr\c>
Download : sample-011.c ( SJIS 版 )
/* * 2012/10/05 sample-011.c */ #include <stdio.h> #include "s_print.h" #include "s_variable.h" /* * */ int main ( void ) { /* * アドレス演算子「&」と間接演算子「*」 */ char carray[3] = "AB"; /* * 添字による参照 */ s_print_string ( "carry[0] = " ); s_print_char ( carry[0] ); s_print_newline(); s_print_string ( "carry[1] = " ); s_print_char ( carry[1] ); s_print_newline(); /* * 間接演算子による参照 */ s_print_string ( "*carry = " ); s_print_char ( *carry ); s_print_newline(); s_print_string ( "*(carry+1) = " ); s_print_char ( *(carry+1) ); s_print_newline(); /* * address の比較 */ s_print_string ( "&carry[0] = " ); s_print_hex ( &carry[0] ); s_print_newline(); s_print_string ( "carry = " ); s_print_hex ( carry ); s_print_newline(); /* * 「&」と「*」 */ s_print_string ( "carry = " ); s_print_hex ( carry ); s_print_newline(); s_print_string ( "&*carry = " ); s_print_hex ( &*carry ); s_print_newline(); s_print_string ( "carry[0] = " ); s_print_char ( carry[0] ); s_print_newline(); s_print_string ( "*&carry[0] = " ); s_print_char ( *&carry[0] ); s_print_newline(); /* * */ return 0; } /* * */
C:\usr\c>sample-011 carray[0] は A です。 carray[1] は B です。 C:\usr\c>
Download : 20121012-01.c ( SJIS 版 )
/* * DATE-DIR-QQQQ.c * メモリ操作での和 * s_memory.h を利用し、 * 100 番地の内容と 101 番地の内容の和を 102 番地に入れるプログラムを作成しなさい */ /* * */ #include <stdio.h> #include "s_print.h" #include "s_memory.h" /* * print_memory_value * 指定された address の記憶セルの内容を画面に出力する */ void print_memory_value ( int address ) { s_print_int ( address ); s_print_string ( " 番地のセルに記録されている数値は " ); s_print_int ( get_memory_value_at ( address ) ); s_print_string ( " です。\n" ); } /* * */ int main ( int argc, char *argv[] ) { /* 値の設定 */ /* * メモリセルの容量 */ set_memory_value_at ( 100, 12 ); /* 100 番地のセルに 12 を記録する */ set_memory_value_at ( 101, 78 ); /* 100 番地のセルに 78 を記録する */ /* * 100 番地の値と 101 番地の値の和を 102 番地にいれる */ /* ** この部分を完成させなさい */ /* * 結果の出力 */ print_memory_value ( 102 ); /* 102 番地のセルの内容を出力 */ return 0; } /* * */
C:\usr\c\> 20121012-01 102 番地のセルに記録されている数値は 90 です。 C:\usr\c\>
Download : 20121012-02.c ( SJIS 版 )
/* * DATE-DIR-QQQQ.c * アドレスを利用した間接参照 * 代入文を利用せず、s_variable.h を利用して、変数 cvar の値を 1 だけふやせ */ #include <stdio.h> #include "s_print.h" #include "s_variable.h" /* memory モデルを理解するための関数定義 */ /* * */ int main ( void ) { /* * C 言語の変数のメモリモデルによる理解 */ char cvar = 'p'; /* char 型の変数 cvar の宣言 */ s_print_string ( "cvar は " ); s_print_char ( cvar ); s_print_string ( " です。\n" ); /* ** この部分を完成させなさい */ s_print_string ( "cvar は " ); s_print_char ( cvar ); s_print_string ( " になりました。\n" ); /* * */ return 0; } /* * */
C:\usr\c\> 20121012-02 cvar は p です。 cvar は q になりました。 C:\usr\c\>