[前回の内容] 「配列名」とは何か ? 配列宣言 int a[3]; 1. a[0], a[1], a[2] 三つの整数型の変数が使えるようになる cf. int v; => 一つの整数型の変数が利用できる 2. 「a」という『配列名』が利用できる => 添え字(「[式]」)を配列名の後ろにつけると、 配列の要素 a[0], a[1], a[2] が参照できる cf. int v0, v1, v2; => 三つの整数型の変数が利用できるが 配列列名に相当ものはない => 添え字がつかえない # 配列の効用 # 添え字の所で「式(変数)」がつかえる # => 柔軟性のある処理ができる !!! 「機能」を実現するためには、 !!! 「コード(プログラム)」が必要 !!! 「コード」の役割の一部「データ」に担わせる事ができる !!! 「コード」:プログラムの作成時で固定される !!! 「データ」:プログラムの実行時になってから確定する !!! => 機能の一部を実行時に決める事ができる !!! => 機能に「柔軟性」を持たせる事が !!! <= データの「柔軟性」からくる 『配列名』を利用して、要素を参照する方法 配列名[式] : 基本 配列名[式] <=> *(配列名+(式)) 「配列名[式]」の場合は、「配列名」だけでは意味がなさそうな感じ 「*(配列名+(式))」の場合は、「配列名」が「計算の対象」になっている 何らかの『値』を持っていると「考える事」ができる => 実際に C 言語では、「『配列名』が『値をもっている』」 『値』ならば、関数の実引数や、返り値にできる 代入の左辺にかける 関数の実引数に、配列名を指定した時の振る舞い 配列の添え字には、 配列のサイズより大きな整数値を指定する事ができてしまう !!!! <= 配列サイズより、大きな添え字が与えられたときには、 !!!! (これは、おそらくは不適切な指定なので..) エラーとしてチェックすべき !!!! 最近の言語では、そうしてくれる場合多い ( 例 : java ) !!!! 実際は、C 言語においては、 !!!! 添え字の範囲のチェックは行われない !!!! => 間違った(配列のサイズより大きな)添え字を指定しても、エラーにはならない !!!! <= プログラマが、添え字の大きなに気を遣う必要がある !!!! => 誤りに気が付かないリスク(欠点)がある !!!! <= リスクをテイクする事に得られる柔軟性(メリット)がある !!!! => メリット: 配列名を引数する関数では、配列のサイズを指定しなくてもよい 関数の引数に配列名を指定する場合 1. 配列のサイズに関しては制限を加えない => 色々なサイズの配列や、利用範囲をその場できめる事ができる <= 配列サイズとは別に、利用範囲 ( サイズより小さい必要がある ) を引数として(余分に ? => 必須に.. ) 指定する 2. 添え字の指定範囲が、配列のサイズを超えないようにする事は、 プログラマの仕事 == 配列と文字列 「文字列」とは ? 文字の並びだった.. という事は.. char の一次元配列が「文字列」 ? 答は Yes でもあり No でもある Yes : 「文字列」は 「char の一次元配列」で「実現」されている char の一次元配列にできることは「文字列」にもできる 「文字列」を「char の一次元配列」の*よう*に扱って良い 要素の変更ができない 「構造」: 文字データが並んでいて、添え字で参照できる 書きかえができないので、 配列が、「変数」の並びである のに対し 文字列は、「定数」の並び と解釈する事ができる (参照の仕方)は同じだが、「属性」(代入できるかどうか)は違う 『文字列』を、文字定数からなる並びと考え、 配列と同じように内容を取り出す事はできるが、 変更はできない !! 『文字列』は、C 言語では、 !! 定数文字型の配列として実現されており、 !! 配列のサイズは、文字列の長さ + 1 !! 個々の要素は、文字のデータをもち、変更できないようになっている !! したがって、「文字列型」は存在しない !! 強いていうなら、「文字列の一次元配列型」のようなもの !! 「変数」と「(値が変更できない、変な)変数」 No : 逆は真ではない(char の一次元配列が、文字列とは限らない) 「文字の一次元配列」を、『文字列』として扱うには、 配列の要素が「文字」の値をもつだけでなく、 文字列の終わりを表す EOS が含まれている必要がある char の一次元の配列の要素を文字にし最後に EOS(\0)を入れれば「文字列と同様に振る舞う」 C 言語のコンパイラが、「文字列」を特別扱いしてくれる 文字列配列を利用する事により、 文字列の処理が色々可能なる 配列の初期化 配列宣言をするときに、その要素を初期化する事ができる <= 「代入」ではない 初期化と同じ形式で、「代入文」を作る事ができない 宣言時、初期化の時だけ、利用できる 初期化する要素の値を並べて、{} で挟む 配列サイズより、初期化する値が小さい場合は、 指定された部分だけが初期化され、残りは不定 初期化を行う時だけ、配列サイズを省略可能 この場合、配列サイズは、初期化する値の個数になる