PPT

情報処理Ⅱ
第7回
2004年11月16日(火)
本日学ぶこと

さまざまな「空」





void型
NULLポインタ
ナル文字('\0')
空文
ポインタを使ったプログラミング


任意型のビットパターン出力
回文判定
2
「空」とプログラム

プログラミングと関係のない「空」の例



「部屋がない」と「空室がある」は違う.
空集合φ={}と,空集合のみからなる集合{φ}={{}}は違う.
Cにおける「空」とは,「それは空である」,「空の…がある」など
を明示するための概念
3
void型

voidは「何もない」や「無効な値」を表す型名




× void x;
○ void *x;
ただし,sizeof(void)は0ではなく1
用途


関数が引数や戻り値を持たないことを明示するとき
• void exit(int status);
プログラムを終了するライブ
ラリ関数.通常,exit(0);
• void procedure(void);
もしくは exit(1); のいず
任意のポインタ型を表現するとき
れかで呼び出す.
• void *p;
• void *malloc(size_t size);
4
NULLポインタ



空ポインタ定数(null pointer constant)とも呼ばれ
る.
NULLはstdio.hなどで定義されている定数で,例えば,
(void *)0 で表現される.
キャスト(明示的な型変換)なしで,任意のポインタ型オブ
ジェクトへの代入,任意のポインタ値との比較が可能

例: if ((fp = fopen("/dev/null", "r")) !=
NULL)
5
ナル文字

'\0' をナル文字(null character)という.




○ '\0' == 0
× '\0' == '0'
× '\0' != NULL
文字列の末尾につく.


ナル文字は,文字列の字数には数えられないが,char型の1
要素分(1バイト分)を占める.
例: #include <strings.h> および char word[] =
"abcdef"; のあとで
• strlen(word) は6.
• sizeof(word) / sizeof(word[0]) は7.
6
空文

「式;」を式文という.式文から式を取り除いたものを空文
(null statement)という.


「{}」は,空ブロックと呼ばれる.
用途


for文の初期化,条件,増分の省略
• for (;;) ...
反復の処理
• for (p = "abcdef"; *p && *p != 'c'; p++)
–
;
'a' 'b' 'c' 'd' 'e'
'f' '\0'
p
7
まとめ

空ポインタ定数のNULL,ナル文字,空文,void型といった
「空(null, empty, void)」の概念がある.
8
ポインタを使ったプログラミング

任意型のビットパターン出力


学ぶこと:ポインタのキャスト(型変換)
回文判定

学ぶこと:文字列の走査
9
任意型のビットパターン出力


float f = 40; char *p = (char *)&f; とすると,
*p, *(p + 1), ..., *(p + sizeof(float)-1)
は,fの「バイトごとの」中身である.
1バイトのビットパターンを求めるプログラムを活用して,バイ
トごとに出力すればいい!
float f :
char *p :
p
p+1
p+2
p+3
は1バイト
10
ポインタのキャストが必要な理由

float f = 40; としたとき,



float *p1 = &f; としてもうまくいかない.
char *p2 = &f; は,型が合わない.
char *p3 = (char *)&f; とすればうまくいく.
float *p1 :
p1+1
float f :
char *p3 :
p3+1
は1バイト
11
ビットパターン出力

float f = 40; の結果


バイトごとに逆順に出力すると


00000000 00000000 00100000 01000010
01000010 00100000 00000000 00000000
fを-10から10まで変えてみると
12
回文判定

仕様




例





入力は,コマンドライン引数から獲得する.
コマンドライン引数の各文字列が回文になっていれば「Yes」を,
そうでなければ「No」を出力する.
英字の大小を区別する.ASCIIコード以外の文字は使用しな
い.
case-sensitive という
./palindrome 12321 123321 noon Noon
12321 : Yes
123321 : Yes
noon : Yes
Noon : No
13
回文判定

1文字ずつ見ていく操作を
文字列の「走査(scan)」という
左と右から1文字ずつ見て


途中で一致していない箇所があれば,「No」
すべて一致し,参照位置が一致または交差すれば,「Yes」
p
'1'
'2'
'3'
'4'
q
'1'
'1'
'\0'
No
'\0'
Yes
r
'2'
'3'
'2'
'1'
14
ポインタ変数は?

char *p = argv[i];



char *q = p;



コマンドライン引数のi番目
文字列走査では固定
文字列の先頭から始まる
文字列走査により1ずつ増えていく
char *r = p + strlen(p) - 1;


文字列の末尾から始まる
文字列走査により1ずつ減っていく
15
まとめ


ポインタ型の値は,キャスト演算子で任意のポインタ型に変
換できる.
文字列の走査には,char *型のポインタ変数を活用すると
よい.
16