C言語のstructとは?複数のデータをまとめる構造体をわかりやすく解説

目次

C言語文法解説シリーズ

本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説します。

👉 C言語文法解説シリーズ一覧はこちら

C言語の struct は、
複数のデータをひとまとめにする仕組みです。

混同しやすいunionについてはこちらの記事で解説しています。

たとえば次のようなコードを見てください。

C
int id = 1;
int age = 20;
int height = 170;

これは「1人分のデータ」ですが、
バラバラに管理されています。

  • id
  • age
  • height

これだと分かりにくいし、扱いづらいです。

そこで struct を使います。


struct の基本

C
struct Person {
    int id;
    int age;
    int height;
};

これで「Person 型」が作られます。

これは

  • id
  • age
  • height

をまとめた型です。


struct を使う

C
struct Person p;

これで変数が作られます。

C
p.id = 1;
p.age = 20;
p.height = 170;

このように使います。

初心者さん

struct って結局何ですか?

エンジニアくん

複数の変数をまとめた型だよ

初心者さん

配列とは違うんですか?

エンジニアくん

配列は同じ型、struct は違う型もまとめられるんだ

ここ重要です。

配列
int a[3];

→ 同じ型のみ

struct
struct Person {
    int id;
    int age;
    int height;
};

→ 違う型もOK


違う型もまとめられる

C
struct Person {
    int id;
    int age;
    float height;
    char gender;
};

全部まとめて1つの変数になります。

C
struct Person p;

メンバアクセスは . を使う

C
p.id = 1;

この .

ドット演算子

といいます。

C
p.age = 20;
p.height = 170;

typedef と組み合わせる(実務でよく使う)

毎回 struct と書くのは面倒です。

C
struct Person p;

そこで typedef を使います。

C
typedef struct {
    int id;
    int age;
    int height;
} Person;

するとこう書けます。

C
Person p;

こちらの書き方が実務では一般的です。


初心者さん

enum のときと同じですね

エンジニアくん

そう、typedef とセットで使うことが多い

初心者さん

struct 名ってどこいったんですか?

エンジニアくん

typedef で型名を付けたから不要になるんだ

typedefの使い方についてはこちらの記事で解説しています。

enumの使い方についてはこちらの記事で解説しています。


struct のイメージ

C
typedef struct {
    int x;
    int y;
} Point;

これを作ると

C
Point p;

中身はこうなります。

C
p
 ├─ x
 └─ y

struct は配列とも組み合わせられる

C
Person list[10];

これで「Personが10人分」

C
list[0].age = 20;
list[1].age = 25;

こう使えます。


struct は関数の引数にもできる

C
void printPerson(Person p)
{
    printf("%d", p.age);
}

普通の型と同じように扱えます。


struct がよく使われる場面

データをまとめる

C
typedef struct {
    int year;
    int month;
    int day;
} Date;

座標

C
typedef struct {
    int x;
    int y;
} Point;

組み込みの設定

C
typedef struct {
    int baudrate;
    int parity;
    int stopbit;
} UartConfig;

実務ではこういう使い方が多いです。


struct 使用時の注意点

struct は値としてコピーされる

C
Person a;
Person b;

b = a;

これは 中身が全部コピー されます。

初心者さん

参照じゃないんですか?

エンジニアくん

C言語では値コピーになるんだ

これは重要ポイントです。


enum と struct の違い

enum

→ 1つの値

struct

→ 複数の値

この違いです。

enumの使い方についてはこちらの記事で解説しています。

enum 使用時の注意点

C言語とC++では struct の扱いが異なる

C言語とC++では、struct の型の扱いが少し異なります。

まず C言語の場合です。

C
struct Person {
    int age;
};

この場合、型名は struct Person になります。
そのため、変数宣言では struct を付ける必要があります。

C
struct Person p;

一方、C++では struct を付けなくても使えます。

C
struct Person {
    int age;
};

Person p;

C++では Person がそのまま型名として扱われます。


C言語では typedef とセットで使うことが多い

C言語でも、C++と同じように書きたい場合は typedef を使います。

C
typedef struct {
    int age;
} Person;

これで次のように書けます。

C
Person p;

実務では、この書き方がよく使われます。


C++では struct に関数も書ける

さらにC++では、struct の中に関数を書くこともできます。

C
struct Person {
    int age;    
    
    void print() {
        std::cout << age;
    }
};

このように、C++では struct も class とほぼ同じように使えます。

C言語の struct は

  • ただのデータのまとまり

C++の struct は

  • データ + 関数

という違いがあります。

※C++では struct と class の違いは、デフォルトのアクセス指定子が
public か private かだけです。


まとめ

struct は

  • 複数のデータをまとめる型
  • 違う型もまとめられる
  • . でアクセスする
  • typedef とセットで使うことが多い
  • 値コピーされる

C言語では非常に重要な文法です。
組み込みでも頻繁に使います。

この記事が参考になった方へ

C言語の基本文法を一覧で整理しています。

👉 C言語文法解説シリーズ一覧はこちら

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

お問い合わせはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする


目次