当日の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\>