情報処理Ⅱ 第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
© Copyright 2024 ExpyDoc