C言語の構造体について、概要と使用方法、関数への渡し方(値渡しと参照渡しの方法)を書いていきます。
1. 概要
構造体はデータ型の一つで、一つ以上の値をまとめて格納することができます。
格納される値はメンバー(フィールド)と呼ばれ、一つずつ型と名前を指定することができます。
2. 使用方法
struct
を使って構造体を定義します。
#include <stdio.h> // 構造体の定義 struct Bokin { int id; int yen; }; int main() { // 変数の宣言 struct Bokin b1; // メンバーに値を代入 b1.id = 1; b1.yen = 100; // メンバーの値を取得 printf("b1.id=%d\n", b1.id); printf("b1.yen=%d\n", b1.yen); // 変数宣言時に値を初期化 struct Bokin b2 = { 2, 50 }; // メンバーの値を取得 printf("b2.id=%d\n", b2.id); printf("b2.yen=%d\n", b2.yen); return 0; }
構造体の型名は Bokin
で、id
と yen
がメンバーになります。
3. typedefを使う定義方法
typedef
を使って構造体を定義すると、変数宣言時の struct
が不要になります。
#include <stdio.h> // 構造体の定義 typedef struct { int id; int yen; } Bokin; int main() { // struct なしで宣言 Bokin b = { 3, 120 }; // メンバーの値を取得 printf("b.id=%d\n", b.id); printf("b.yen=%d\n", b.yen); return 0; }
4. 値渡しの方法
関数に値渡しをする方法は以下の通りです。
#include <stdio.h> typedef struct { int id; int yen; } Bokin; void change(Bokin bokin) { // ピリオドでアクセス bokin.id = 5; bokin.yen = 20; } int main() { // 構造体の宣言 Bokin b = { 4, 200 }; // 関数に値渡し change(b); // 値渡しの場合は変更されません printf("b.id=%d\n", b.id); // 4 printf("b.yen=%d\n", b.yen); // 200 return 0; }
値渡しの場合、構造体の中身が全てコピーされます。メモリの使用量が増える点と、コピーにかかる時間に注意する必要があります。
5. 参照渡しの方法
関数に参照渡し(アドレス渡し)をする方法は以下の通りです。
#include <stdio.h> typedef struct { int id; int yen; } Bokin; void change(Bokin* bokin) { // アロー演算子でアクセス bokin->id = 5; bokin->yen = 20; } int main() { // 構造体の宣言 Bokin b = { 4, 200 }; // 関数に参照渡し change(&b); // 参照渡しの場合は変更されます printf("b.id=%d\n", b.id); // 5 printf("b.yen=%d\n", b.yen); // 20 return 0; }
渡す側は &
を付けて、変数のアドレスを渡します。渡される側の引数は *
を付けて、アドレスを格納するポインタ変数になります。
アドレスとポインタについて
アドレスとポインタの詳細は、以下のリンク先を参照して頂けると嬉しいです。