fall and fall

二次創作、作詞、ゲームのことなどを書いています。

C言語 構造体の概要(使用方法・値渡しと参照渡しの方法)

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 で、idyen がメンバーになります。

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;
}

渡す側は & を付けて、変数のアドレスを渡します。渡される側の引数は * を付けて、アドレスを格納するポインタ変数になります。

アドレスとポインタについて

アドレスとポインタの詳細は、以下のリンク先を参照して頂けると嬉しいです。

C言語 アドレスとポインタの概要(&と*の使用方法)