こんにちは､ そしてお帰りなさい｡ 構造体についての説明を続け､
配列との関連について説明します｡
構造体は配列と似ていて､ 1つ以上の値を格納できることを話しましたが､
異なるデータ型を持つことができ､ そのようにグループ化することができる点が異なります｡
しかし､ 実際には構造体の配列のようなものを持つこともできます｡
つまり､ 構造がいかに便利で､ 関連する要素を論理的にグループ化できるかがおわかりいただけたと思います｡
structキーワードで､
タグ名を使って､ 異なる要素を持つ構造体を定義する方法は知っています｡
そして､ その型の変数を作成する方法も知っています｡
なぜなら､ 構造体とは本質的に､ 使用できる新しいタイプのデータだからです｡
そして､ メンバー選択演算子を使って構造体の要素にアクセスすることができます｡
では､ 配列の中に複数の構造体を作りたい場合はどうでしょう｡
できるんですね｡
だから､ 例えばプログラムで使う日付ごとに3つの変数を管理するのではなく､
1つの変数を管理すればいい､ それが構造体の利点です｡
もし､ あるプログラムの中で10種類の日付を扱うとしたら､
30種類の変数ではなく10種類の変数を記録しておけばよいのです｡
なぜなら､ 構造体はそれ自身の内部に3つの変数を含んでいることを思い出してください｡
異なる変数に10個というのはまだちょっと多いので､
本当に最適な方法とは言えません｡ 配列を作成することになるでしょう｡
なぜなら､ 10個のintが同じであるのと同じように､ 10個の同じタイプがあるからです｡
構造型があるだけでしょう｡
そこで､ 10種類の日付を処理するためのより良い方法として､
c言語の強力な2つの機能､ 構造体と配列の組み合わせがあります｡
併用することで､ より強力になります｡
ですから､ 構造体の配列を定義することは全く問題ありません｡
構造体の配列という概念は､ cでは非常に強力で重要な概念ですので､ よく注意してください｡
構造体の配列の宣言は､ 他の種類の配列の宣言と同じです｡
型を指定すると､ それがたまたま構造体の型であっただけです｡
つまり､ dateという名前の構造体の配列を作りたい場合は､
struct dateと言い､
次に変数名､ そして他の配列と同じように括弧を使って､
サイズを指定する必要があるのです｡
つまり､ この場合､ 日付構造体型のインスタンスまたは要素を 10 個作成する場合は､
括弧の中に 10 という記号を付けます｡
つまり､ 10個の要素からなるmy datesという配列が定義されることになります｡
配列内の各要素は, 3つのメンバを含むbf型構造体dateとして定義される．
つまり､ 30種類のデータセット､ 30種類のデータエレメントを保存していることになるのです｡
構造体の配列のメンバーを特定するには､ 個々の構造体に対して使用するのと同じルールを適用します｡
構造体名をドット演算子で指定し､ その後にメンバー名を指定してファイルします｡
配列の中の特定の構造体要素を参照することは､ ごく自然なことです｡
my dates配列の2番目の日付を1986年8月8日に設定するには､ 配列の名前my
datesとインデックスを指定するだけでよいのです｡
ここでは2回目の日付を指定しています｡
配列は0ベースであることを忘れないでください｡ だから､ 1､ サブ1と言っているのです｡
そして､ その配列要素の要素や､ その要素に対する構造体のメンバーにアクセスしたい場合は､
ドット月と言います｡
これで､ my dates 配列の 2 番目の要素を取得できます｡
その構造体型の月の値で､ ここでは8という値を代入しています｡
そして､ 日にちにアクセスしたい場合は､ 8月8日なので､
8という日を割り当てます｡ そして､ 最後に年ですが､ ドットイヤーは1986年に相当するとします｡
このように､ my dates配列の2番目の要素に､ struct型であるdate
structなので､ 3種類の変数を代入することができるのです｡
本当に何も変わっていないことに気づくはずです｡
ただ､ ここでの違いは､ ドットがあることです｡ 通常は､ その配列の型によって1つの変数しか代入できないので､
my dates sub-1と言えばそれで終わりです｡
しかし､ この場合､ 構造体の中の3つの要素なので､ 3つの異なる変数でsub-1を言うことができます｡
構造体の配列を初期化する｡
構造体を含む配列の初期化は､ 多次元配列の初期化と同様である｡
多次元配列では､ 外側に中括弧､ 内側に中括弧を付けて各行を表現する構文に従うことを思い出してください｡
内側の中括弧は実はオプションだったのですが､ これによって読みやすさが格段に向上しました｡
だから､ 私はその慣習に従うのが好きなんです｡
この例では､ 構造体 date 型の my dates を作成しており､
サイズは 5 になります｡ そして､ 最初の3つの要素だけを初期化するのです｡
多次元配列と同じように､ 中カッコで囲んでいます｡
そして､
ゼロ以下のインデックスであるmy dates配列の最初の要素になります｡ 月は12､ 日付は10､
年は1975年ということにしています｡
そして､ 最初の要素も同じようにします｡ 12 30 1980とする｡
そして､ 3つ目の要素は､ 11 15 2005とします｡
また､ my dates 配列の他の 2 つの要素を指定しなかったので､
これらは何も初期化されません｡
これで最初の3つの日付が設定されるわけです｡
配列の中で､ 私の日付は､ 1975年12月10日､ 1980年12月30日､
2005年11月15日となっています｡
中括弧の内側のピリオドは､ 多次元領域と同じように任意です｡
しかし､ やはり中括弧がある方が読みやすく､ また､ フォローしやすいので､
私はその慣習に従います｡
しかし､ カンマで区切ったり､
要素をカンマで区切ったりすることになるので､
これらの処理をたくさん行っていると､ 非常に分かりづらくなります｡
正しくマッピングする必要があります｡ 例えば､ 4番目のカンマが4番目の要素にあるとすると､
それは配列の2番目の要素になり､ フォローするのが難しくなるので､
中カッコで囲んでください｡
配列の3番目の要素だけを指定した値で初期化したい場合は､ my
dates sub-5を指定すればよい｡
ここではまだ配列を作成していますね｡
変数を宣言して､ サイズを5に設定したままです｡
でも中括弧の中は2つで､
2を12 10 1975に初期化すると言うことですね｡
角括弧は初期化したい要素を表し､ 代入演算子equal､
中括弧の中では構造体の中の要素の月､
日､ 年を初期化しています｡
そのため､ 初期化する要素も正確に指定することができます｡
もし､ my dates配列の2番目の要素である月と日を12と30に設定したいだけなら､ 非常に似たようなことができます｡
各属性を区切るためにカンマをするだけです｡
実際には年を設定したくないので､ 中括弧を使えるようにしたいのです｡
ドット月イコール12サブ1ドット日イコール30と言うことができます｡
そしてまたこの構文は､ 他の場所で構造体変数を初期化するのと非常によく似ています｡
ここは配列なので､ 配列のインデックスを指定しなければならないのが唯一の違いですが､
似たような構文です｡
配列を含む構造体についてはどうでしょうか｡
構造体の内部で, 配列を含む要素｡
また､ メンバーとして配列を含む構造体を見つけることも可能です｡
これは便利かもしれませんね｡
最も一般的な使い方は､ 構造体の中に文字の配列を設定することです｡
文字列にはchar配列がよく使われますね｡
ですから､ 構造体が本質的に文字列を含むことは､ 非常に一般的なことでしょう｡
そこで､ 月の日数と3文字の月名の略称をメンバに持つmonthという構造体を定義するとします｡
まあ､ そこで文字配列が使えるんですけどね｡ 構造月と言えるかもしれません｡
私たちは構造を定義する方法を知っています｡ 繰り返しますが､ これはメモリを確保しているわけではありません｡
このように構造を定義しています｡ その中に含まれる要素です｡
ここでは､ struct キーワードを使用しています｡ 構造体の名前を言うんです｡ タグ名はmonth､ そして左中括弧で囲み､
要素を指定します｡
日数を表す整数の要素が1つあり､ 最後にセミコロンがあります｡
そして､ 文字配列､ 文字名sub-three､
つまり3文字なので3というサイズです｡
そして､ セミコロンの右中括弧で構造を終了させる｡
しかし､ 文字は配列であり､ ポインタと密接な関係があることを忘れないでください｡
しかし､ 構造体をメンバ要素として置くだけで､ 簡単に配列を含ませることができるのです｡
そして､ 日数という整数のメンバと､ 名前という文字のメンバを含む月構造体が設定されるわけです｡
メンバー名は実際には3文字の配列で､ とても簡単です｡
では､ 実際にどのようにアクセスするのでしょうか｡ さて､ まずは変数を作る必要がありますね｡
この変数は構造体内の要素のメモリを作成し､ 8ヶ月変数の中の適切なフィールド､
つまり文字配列の名前を設定するだけです｡
名前と日数がありました｡
ここでは名前といい､ 例では月という｡
まあ､ monthが変数型､ そしてnameが要素型ですから､ それはそれで正しいのですが｡
そこで､ ここでは､ 構造体を作成します｡ タイプ月です｡
変数名が月なんですよ｡ 何も初期化しない｡
早速､ 月間の日数を31日に設定しました｡
そのドットメンバー選択演算子を使うのです｡
そして､ 文字配列に代入したいのですが､ 文字配列に直接代入することはできません｡
全部にサインするならstrコンペアとかしないとダメでしょ｡ そして､ それができるようになった｡
これらのインデックスを使用する必要はありません｡ str copy a month
dot name comma and j a n in double
quotes とか､ インデックスで配列の要素にアクセスするやり方もあります｡
ここで月点名と言っているのは､ nameメンバー変数やメンバー要素にアクセスしなければならないからです｡
そして､ 大括弧の中に､ 配列のインデックスを指定します｡
配列の1番目の文字j､ 2番目の文字a､ 3番目の文字nに署名していることを確認します｡
この構文は､ intやdouble､ floatを扱う場合に見られるものです｡
通常､
文字配列がある場合､ str stir copy関数を使い､ すべてをダブルクォートで代入することになります｡
また､ 変数を宣言するときによく似たことをすれば､ 同じ値で初期化することができます｡
中括弧の中だけ､
配列なので､ 中括弧の中だけ､ そして各文字をシングルクォートで囲みます｡
また､ 配列の中に12ヶ月の構造を設定することで､ 1年の各月を表現することができます｡
これで､ struct month
型のサイズ 12 の配列である month の変数が作成され､ 各月を表すことができるようになったわけです｡
そして､ 月ごとに､ 日数､ そして月の略称をかけることができます｡
ですから､ 配列と構造体という2つの強力な概念を活用すると､
とてもとても便利なのです｡
構造体は多くの要素を持つことができるので､
実際には配列の構造体であり､ 構造体の中の要素は配列であることができます｡
そして次に､ 構造体を使ってポインタのような他の要素を格納する方法について説明します｡
しかし､ 構造体はどんな種類のデータでも､ たくさん保存できることがおわかりいただけると思います｡
そして､ 配列の概念と一緒に使うと､ とてもとても便利です｡
参考になったでしょうか｡ 繰り返しになりますが､ これらのコンセプトのいくつかを実証し､
コードブロック内の例を後で持ち出すという課題があります｡
ありがとうございます｡