2021/11/26 前回(2021/11/19) の内容 配列 : (what) 同じ型の「変数」が並んだもの 個々の変数に、その型のデータを記録する そのデータ型の「集まり(順序付き)」を表現 データ型 定数の表現 例 : 整数型 -> 123 / 文字型 -> 'c' / 浮動小数点数型 -> 1.23 そのデータ型の変数 ( 変数は型をもち、その型の定数値を保持する ) int vi; vi = 123; /* 変数に定数値を代入する */ 配列/構造体 変数の宣言の仕方があるだけ # 定数の表現はない !! 本来、「データ型」の対象 => 「(定数)値」の集合を指す !! C 言語では、(残念な事に..) 「データの組み合わせ」はできない !! 例 : 二次元平面の点を表すデータ型 ( x, y 座標の組 => (1,2) ) !! C 言語で、複雑なデータ型の「値」を表現するには ? !! => (間接的に..) そのデータ型の値を保持できる「変数」を作り、 !! その変数に保存されている「値」を !! その「変数の型の値」として扱う 例: 整数型 printf ( "%d\n", 1 ); 定数を直接操作 int i; i=1; printf ( "%d\n", i ); 変数を経由して操作 二次元の点の場合 typedef struct { int x; int y; } Point; Point p; /* Point 型の変数 p */ p = ( 1, 2 ); /* こう書く事ができれば良いのだが... */ /* => 定数を表現する方法がないのでダメ */ p.x = 1; /* 変数の一部の値を書き換える事により.. */ p.y = 2; /* 間接的に、変数 p に (1,2) 相当のデータを記録 */ /* 以下、(1,2) という点の操作を、 変数 p を利用して、行う事ができる */ 配列を利用して、その型の要素をもつ有限集合を表現できる 配列の使い方(how) 配列(複数の変数をまとめたもの)の宣言 要素の型名 配列名[配列サイズ]; => 1. 要素の型の変数が配列サイズ個だけ利用できるようになる 2. 配列名が利用できるようになる 配列の要素の参照(利用) 配列名[添え字] 「添え字」は、整数値をもつ式を指定できる !! 式の中に「変数」を含める事ができる !! => 変数を含む式を添え字とする配列を利用する文は、 !! 変数の値によって異なる振る舞いをする !! !! もし、添え字に 整数定数しか指定できないなら、 !! !! 配列は、劣化した構造体にしかならない !! !! しかし、配列の添え字には、(変数を含む)式が書けるので、 !! !! 構造体には(簡単には..)できない事が(簡単に..)できる 配列の配列も作れる 二次元の配列 要素の型名 配列名[配列サイズ1][配列サイズ2] => 配列サイズ1 x 配列サイズ2 個数の変数が利用可能になる 要素を参照する場合 配列名[添え字1][添え字2] => 一般に n 次元可能 [2021/11/26(資料は 2021/11/19 のもの利用)] 配列要素の参照方法 基本は添字参照「[]」を利用する 例 : int ary[5]; の時 ary[2] は 3 番目の要素の参照 間接参照「*」で先頭の要素が参照できる (文字列の時と同じ) 例 : *ary は ary[0] と同じ 配列名に整数値を加えると、配列の先頭の要素が「ない」ように振る舞う 例 : *(ary+3) は ary[3] と同じ (文字列の時と同じ) 配列要素参照「[]」と「*」の関係 (配列一般) 「ARY[INDEX]」と「*(ARY+INDEX)」は何時も同じ振舞いをする !! 配列と文字列は同じようにふるまう 「配列名」の意味(詳細は後日) !! 単独の「配列名」の意味 !! => 「ポインター定数値」である(あとで説明される..) !! !! 過去のアルゴリズムでは配列を利用したものが多い !! !! <= 添え字に変数が使える !! !! => ポインター型の特徴 !! !! 配列を利用アルゴリズムは、ポインターを利用したアルゴリズム !! !! C 言語より古い言語では、 !! !! 配列はつかえるがポインター型が使えなかった !! !! => ポインター型の機能を実現するために、配列の代用した !! !! C 言語では、ポインター型が直接扱えるので、本当なら、配列よりポインター型の話をくわしくすべき.. !! !! ただ、 !! !! 配列の方がわかりやすい !! !! 配列の方が歴史がある !! !! => 配列の話をする 「間接参照「*」や添字参照「[]」をする」事ができる「値」を表す 配列名は、「ある値」をもっていて 「その『値』」に「*」や「[]」をつける事により、 配列名をもつ配列(変数の集まり)の要素(変数)が参照できるようになる 「値」なので、関数に渡したり、関数の値にできる 「配列名」 配列の宣言すると、利用できるようになり 配列の要素を参照するために利用される => 配列の要素(変数)が利用できる 「配列名」も使えるように 値をもっていて、関数の引数に指定できる [まとめ] 配列名は、 配列の要素の場所を表す値を持つ 値 => 関数の引数に指定して関数に渡す事ができる その値をつかって、配列の要素を、関数内で操作(代入ができる) 配列の要素の参照の仕方 [] (添え字) 以外に * を使っても参照できて => 文字列と同じ振る舞い [次回] 文字列を操作方法(2021/11/19 の内容) => メモリモデル(2021/11/26) => ポインター値の導入