『C言語入門編8: 構造体を理解しよう (全9回) 』
メモ
#01:構造体について学習しよう
- 構造体とは
構造体は、変数をひとまとまりにしたもの
・配列と違って、データ型が異なる変数も一緒にまとめることができる
・構造体の持つそれぞれの変数は「メンバ」と呼ばれる - 構造体を使用するメリット
- 関連のあるデータをまとめることができる
コードの見通しがよくなり、無関係な値を変更してしまうリスクを減らすことができる - 一度宣言した構造体は何度でも利用できる
構造体のメンバを宣言しなおす必要がない。
そのため、効率よくコードを作成できる。
- 関連のあるデータをまとめることができる
- オブジェクト指向言語の「クラス」との違い
- Java や C# などのオブジェクト指向言語には「クラス」がある。
⇔ C 言語には、クラスの機能がない。 - C 言語の構造体は、クラスの機能を限定したものと考えることもできるが、大きな違いとして、
クラスでは「メソッド」というオブジェクトの操作を記述できるが、
C 言語の構造体ではメソッドを記述できない。
- Java や C# などのオブジェクト指向言語には「クラス」がある。
#02:構造体を作成しよう
- 構造体を宣言するstruct 構造体タグ {
メンバ 1;
メンバ 2;
...
};- 最後の ; (セミコロン) を忘れてしまうことが多いので注意
#03:構造体を扱うときに便利な機能を使ってみよう
- 構造体のメンバに strcpy を使う
構造体のメンバが文字列のときは、 strcpy を使ってコピーできる。 - typedef を使うとデータ型に名前をつけることができる。typedef データ型 新しい名前;
- 構造体宣言で typedef を使うtypedef struct {
char name[20];
int hp;
int power;
} Player;
#04:構造体を使った関数をつくろう
- 構造体を引数で受け取る関数
構造体から宣言した変数は、通常の変数と同じように、関数の引数で渡すことができる。- ※ 関数の引数で構造体を渡す場合、値のコピーが渡されまので、構造体のサイズが大きいと (構造体のメンバにある配列が大きいなど) コピーに時間がかかってしまう。
→ そのようなときに、構造体へのポインタを渡す方法が推奨される
- ※ 関数の引数で構造体を渡す場合、値のコピーが渡されまので、構造体のサイズが大きいと (構造体のメンバにある配列が大きいなど) コピーに時間がかかってしまう。
- 構造体を作成して返す関数
構造体は、直接代入ができるデータ型なので、関数の戻り値にすることができる。
一方で配列は、値を直接代入できず、関数の戻り値にすることができない。
#06:構造体とポインタ
- アロー演算子
- 構造体へのポインタを使ってメンバを書き換えるには、次のように記述する(*p).hp = 200;
- これは、「アロー演算子」を使って以下のように書くことができます。p->hp = 200;
- 構造体へのポインタを使ってメンバを書き換えるには、次のように記述する
#07:構造体でつくる連結リストを理解しよう
- 連結リスト
連結リストは、「ノード」と呼ばれる各要素をつなげてできたデータ構造- 配列と違ってインデックスが定められておらず、
データの追加や順番の変更が簡単にできるのが特徴。 - 連結リストでは、要素数も自由に変更できる。
- 配列と違ってインデックスが定められておらず、
- 連結リストの実装方法
連結リストのノードは、構造体とポインタを使って実装することが多い。- 構造体は、異なる型の値を保持できるため、ノードの実装に適しているstruct node {
int num; // 整数値データ
struct node *next; // 次のノードへのポインタ
};
- 構造体は、異なる型の値を保持できるため、ノードの実装に適している
- 連結リストの種類
- 単方向リスト
次のノードにしか移動できない連結リスト - 双方向リスト
前のノードと次のノードに移動できる連結リスト - 線形リスト
ノードが直線状に並ぶ連結リスト - 循環リスト
最後のノードが最初のノードにつながっている連結リスト
#08:連結リストを実装しよう (1)
- 構造体のメンバに、自身の構造体へのポインタを持つ構造体は「自己参照構造体」と呼ばれる。struct node {
int num;
struct node *next; // 自身の構造体へのポインタ
};
認定証
連結リストってどこかでやった気もするけど、
本レッスンのおかげで理解が深まったと思う。
学習ステータス
まだ昇格しないっ!?
ずっと若手のままか😁
※コメント投稿者のブログIDはブログ作成者のみに通知されます