C 言語で初めから用意されているデータ型(int 型/char型) -> 直接 C 言語の中表現できる そうでないものは ? -> coding ( C 言語で表現できるものと、 新たに表現したものの間に「対応付け」を行う C 言語で表現した、データの操作を、 対応したものの操作と解釈可能 ) C 言語内 現実 整数値 文字 65 <-ASCII-> 'A' 66 'B' 65 + 1 -> 66 'A' -> 'B' coding の対応が複雑になる プログラムが分かりにくくなる C 言語で、現実に即した形での新しいデータ型を作る 方が、プログラムが解りやすくなり結果して作りやすくなる C 言語での新しいデータ型の作り方 複数のデータを組み合わせる 異なる物を組み合わせる場合は、構造体を利用する 同じものを組み合わせてもよい cf. 複素数 ( double re, double im ) 同じものを組み合わせる場合は、配列を利用する 表現能力の観点からは、配列は劣化構造体 しかし、 効率が良い(同じ型のデータしか入っていない事を利用) 要素の参照が速くなる 添え字を使って参照できる 添え字の所に式が記述できるので、便利 関数とのやり取りの時に、 配列と、それいがい(単純型や構造体型)と異なるふるまい -> 便利と感じる人がいる # 配列の良さは # 本質的には、配列そのものではなく、 # その裏側で働いている「ポインター」ものの性質 !! データ構造としては、構造体の方が本質 !! 配列の高速さと使いやすさ !! -> 配列を利用した様々な実例につながっている !! <- class という拡張された構造体(C 言語ではつかえない) が中心 p-009.c ソーティング(並び替え) 複数のデータから複数データを作るので、 そのデータを保存しておく変数が必要なので 配列が便利 ソーティングでは、要素の書き換えが必要になるので、 添え字が、代入文の左側に書ける事が本質的 配列の要素の参照 配列の要素は、添え字で参照する 例 : int iary[10]; iary[3] <- 0,1,2,3 の 4 番目の要素を参照 [] という表現は -> 以前にもあった。 文字列の所でやった 文字列 : 文字の並びに最後に EOS (\0) もの 例 : "abc" <-> 'a', 'b', 'c'. '\0' *"abc" -> 先頭の文字である 'a' "abc" + 1 -> 先頭の文字を取り除いた "bc" *("abc"+1) -> *("bc") -> 'b' "abc"[1] <-> *("abc"+1) "abc"[n] <-> *("abc"+n) iary[3] <-> *(iary + 3) 関数と配列 配列名を、関数の引数に渡す事によって、 関数を呼び出す側で設定した配列の要素の値を、 呼び出された関数の中で、参照(読み出し)できる # これは、単純変数や、構造体でも同様だった 配列を処理する(呼び出される)関数では、 配列のサイズを省略できる(きにしない) -> 同じ関数で、異なるサイズ配列が処理できる その代わりに、要素数(処理数)は、別に与える必要がある また、配列名は「値」なので、「計算した結果」でもよい 関数の仮引数変数宣言 int iary[I_ARRAY_SIZE] <- 完全な記述 int iary[] <- 配列サイズを省略 int *iary <- 「文字列」の宣言と似ている (char *) 配列名を関数の引き数として指定すると C 言語では、関数の引数は、コピーされる 「値の」コピーが渡される 配列の要素の値のコピーではない why ? (結果的に..) 呼び出した関数の中で、配列要素の値を変更する事が可能 危険(元の値が失われる:代入文の欠点)が、効率がよい char 型の一次元配列 -> 文字列のようにふるまわせる事ができる 配列の先頭部分に文字をいれ、最後に EOS(\0)入れる 文字列は、「その要素の値を変更できない」だけで、後は、配列と同じように扱える。 計算して、先頭をずらしたり、添え字をつけて、要素を取り出したりできる 文字列の処理を行うには、char 型配列を利用すればよい 文字列は char * 型の特殊なもの