※本記事は広告を含みます。
C言語文法解説シリーズ
本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説します。
C言語の struct は、
複数のデータをひとまとめにする仕組みです。
混同しやすいunionについてはこちらの記事で解説しています。
たとえば次のようなコードを見てください。
int id = 1;
int age = 20;
int height = 170;これは「1人分のデータ」ですが、
バラバラに管理されています。
- id
- age
- height
これだと分かりにくいし、扱いづらいです。
そこで struct を使います。
struct の基本
struct Person {
int id;
int age;
int height;
};これで「Person 型」が作られます。
これは
- id
- age
- height
をまとめた型です。
struct を使う
struct Person p;これで変数が作られます。
p.id = 1;
p.age = 20;
p.height = 170;このように使います。
初心者さんstruct って結局何ですか?



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



配列とは違うんですか?



配列は同じ型、struct は違う型もまとめられるんだ
ここ重要です。
int a[3];→ 同じ型のみ
struct Person {
int id;
int age;
int height;
};→ 違う型もOK
違う型もまとめられる
struct Person {
int id;
int age;
float height;
char gender;
};全部まとめて1つの変数になります。
struct Person p;メンバアクセスは . を使う
p.id = 1;この . を
ドット演算子
といいます。
p.age = 20;
p.height = 170;typedef と組み合わせる(実務でよく使う)
毎回 struct と書くのは面倒です。
struct Person p;そこで typedef を使います。
typedef struct {
int id;
int age;
int height;
} Person;するとこう書けます。
Person p;こちらの書き方が実務では一般的です。



enum のときと同じですね



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



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



typedef で型名を付けたから不要になるんだ
typedefの使い方についてはこちらの記事で解説しています。
struct のイメージ
typedef struct {
int x;
int y;
} Point;これを作ると
Point p;中身はこうなります。
p
├─ x
└─ ystruct は配列とも組み合わせられる
Person list[10];これで「Personが10人分」
list[0].age = 20;
list[1].age = 25;こう使えます。
struct は関数の引数にもできる
void printPerson(Person p)
{
printf("%d", p.age);
}普通の型と同じように扱えます。
struct がよく使われる場面
データをまとめる
typedef struct {
int year;
int month;
int day;
} Date;座標
typedef struct {
int x;
int y;
} Point;組み込みの設定
typedef struct {
int baudrate;
int parity;
int stopbit;
} UartConfig;実務ではこういう使い方が多いです。
struct 使用時の注意点
struct は値としてコピーされる
Person a;
Person b;
b = a;これは 中身が全部コピー されます。



参照じゃないんですか?



C言語では値コピーになるんだ
これは重要ポイントです。
enum と struct の違い
enum
→ 1つの値
struct
→ 複数の値
この違いです。
enum 使用時の注意点
C言語とC++では struct の扱いが異なる
C言語とC++では、struct の型の扱いが少し異なります。
まず C言語の場合です。
struct Person {
int age;
};この場合、型名は struct Person になります。
そのため、変数宣言では struct を付ける必要があります。
struct Person p;一方、C++では struct を付けなくても使えます。
struct Person {
int age;
};
Person p;C++では Person がそのまま型名として扱われます。
C言語では typedef とセットで使うことが多い
C言語でも、C++と同じように書きたい場合は typedef を使います。
typedef struct {
int age;
} Person;これで次のように書けます。
Person p;実務では、この書き方がよく使われます。
C++では struct に関数も書ける
さらにC++では、struct の中に関数を書くこともできます。
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言語の基本文法を一覧で整理しています。
技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。









コメント