[前回] データ構造 [背景] 目的 => プログラムを作成 そのプログラムを実行する事が、 何等かの形で、現実と対応して、現実に影響を与える 例 : プログラム上の単なる足し算 <-> 現実の銀行口座の振り込み 現実の情報と、コンピュータ内のデータ(数値)の対応関係が重要になる 現実の世界 : 複雑 例 : 平面上の点 ( 一つの数値ではなく、二つの数値で表現する事が、「自然」 ) コンピュータ(C 言語のあらかじめ与えられている数値の形式) : 有限個 ( char, int, double ) 対応関係を作るには、なんらかの工夫 例 : C 言語では「二つの数値を組み合わせる」という工夫をする => あらかじめ用意されているデータ型に対し、それとは異なる新しい型を導入できる typedef : 新しい型を C 言語に導入する仕組み 組み合わせ : struct (構造体) を使う 新しい型が導入されても、それは、あくまでも「形式」だけ <= これに、「意味」を付加する必要がある # いろいろな人が、自分で新しいデータ型をつくって、 # 独自の意味付けを行っている # => それを他の人(3 カ月後の自分..)に利用できるようするには # その「意味付け(新しいデータ型の形式と、それを操作する関数):API」 # を、資料(Document 化)しておく必要がある p-002.c : 有理数型を作った 形式 ( 分母と分子の対 ) だけ、決めても、「有理数」としてはふるまわない それを正規化したり、計算機能を追加して初めて、「有理数型」として「意味」を持つ [今日の話] 構造体 : いろいろな型を有限個数組み合わせて、新しい型を作る仕組み 配列 : 同じものを不特定多数組み合わせて、新しい型(?)を作る仕組み !!! 配列の要素の参照には「(計算)式」が使える => すごく便利 構文 配列宣言 : 型名 配列名[配列のサイズ]; cf. int a[10]; /* 整数の要素を 10 個もつ配列 a を宣言 */ /* 個々の要素は a[0] 〜 a[9] で参照可能 */ 意味: 配列名 [ 添え字 ]; 添え字の部分には(普通は非負の)整数値が与えられると、 その整数番目の要素が操作できる 配列の利用 要素の参照の時に、 配列名[添え字] <-> *(配列名 + 添え字) さらに、「添え字」が 0 の時は、 配列名[0] = *(配列名 + 0) = *(配列名) = *配列名 !!! 前期に、何かの前に「*」を付ける 配列の文字列の関係 C 言語では、「文字列」は、「char 型配列」の形で実現されている [] を利用して、要素 (char 型 : 文字)が取り出せる * は、その [] の特別な記法 ( "abc"[0] <-> *("abc"+0) <-> *("abc") <-> *"abc" +1 することは、配列の先頭の要素の場所を指している値を一つ増やしている => この結果、その値は、配列の次の要素を指す事になり、結果として、 先頭の文字が欠けた文字列と同じものを表す事になる # データのある場所を指す値 : ポインター値と呼ぶ 「配列名」は、配列の要素の先頭の要素のある場所を値としてもっている # 「配列名」は先頭の要素を指すポインター値 # +1 すると、その指す値は、配列の次の要素を指す事になる