配列の宣言 配列のサイズを指定して宣言する # 普通の変数は、一つ分のサイズで、型が解れば、メモリに対応させる事ができる サイズをしている事の意味 コンパイラ(実行にプログラムが..)自動的にその領域を管理する プログラマは、利用するサイズをプログラム時に指定するという コストを支払う コンパイラが、領域の管理というサービスをしてくれる じゃあ、そのサービスいらない コストもいらない ?? もし、実行時に自由に配列が作れれと便利では ? <= 領域の管理を、自分で行う必要がでてくる C 言語では、動的(実行時)に、自由に配列のサイズを決められる -> その管理を自分で行う必要がある 領域の確保 alloc ( malloc/calloc ) の利用 領域を参照するためのポインターの保持 (普通の変数や配列ならば、アドレスに対応した名前があるが、 これもサービスの一部で、自分やる場合は提供されないので ポインタ値を保持する変数が必要 ) 領域の開放 free の利用 動的なデータ構造 データとデータの関係(データ構造)が、変化するようなデータ型の事 cf. 配列や、構造体は、データ構造が固定(静的) -> 特に、静的なデータ構造はサイズが固定 <- 動的なデータ構造の場合は、データ間の関係や、サイズを変更できる -> より便利 -> 本質的に alloc/free を利用する必要がある。 具体例として: List を考えてみる List : (同じ型の)要素が順に並んでいるもの 具体例: 「1, 3, 9, 13」は、四つの整数値が並んだもの cf. 配列との違いは ? -> 要素の追加や、削除ができる その位置は、既存の要素のどの前後でもよい -> サイズが可変 ( 配列では困難 ) 実装 : これをどのように実現するか ? # cf. 十分に大きなサイズ配列で対応するも「なくはない」 # しかし、ここでは、動的な対応をする Linked List という考え方 ( List の実装の一つ ) Cell +-------+ |次 | +-------+ |値 | +-------+ List : [ 1, 3, 9, 13 ] List ---+ | +-------+ +-------+ +-------+ +-------+ +---> | *-----> | *-----> | *-----> | *-----> NULL +-------+ +-------+ +-------+ +-------+ | 1 | | 3 | | 9 | | 13 | +-------+ +-------+ +-------+ +-------+ List : [ -7, 1, 3, 9, 13 ] 先頭に、新たに -7 という要素を追加した List ---+ | +-------+ +-------+ +-------+ +-------+ +---+ +-> | *-----> | *-----> | *-----> | *-----> NULL | | +-------+ +-------+ +-------+ +-------+ | | | 1 | | 3 | | 9 | | 13 | | | +-------+ +-------+ +-------+ +-------+ | | | +-------+ | | | +-------+ | +-> | *-------+ +-------+ | -7 | +-------+ 動的なデータ構造 動的なメモリ管理 Cell の新たに作られたり、捨てられたりしている