はじめに
- これまでの学習に続いて、今回は構造体について学んだ結果をまとめてみました。
学習環境
- 今回はpaiza.ioのC言語のエディタを使いました。
構造体とは
- データ型の一つで、1つもしくは複数の値をまとめて格納できる型のこと。(Wikipediaより)
- JavaやC#のクラスは「データとデータに紐づく処理をまとめたもの」なので、構造体は似て非なるものだと思います。
- VBAのユーザー定義型は構造体と同義だと思います。
サンプルコード
構造体を使った例
- 普通に構造体を使うと、以下のようになります。
- 構造体
employee
型の変数を宣言する際に、常にstruct
というキーワードが必要になるのが注意点です。
- 構造体
-
_employee
のように下線(アンダースコア)で始まる名前は予約されているので、このような名前をユーザーが使うのは好ましくありません。(※参考URL)- @SaitoAtsushi さん、ご指摘ありがとうございました。
Main.c
#include <stdio.h>
struct employee { /* タグ名:社員型 */
int id; /* 整数型のメンバ変数:社員番号 */
char* name; /* 文字列型(char型のポインタ)のメンバ変数:社員名 */
};
int main(void){
struct employee emp;
emp.id = 1;
emp.name = "Sato";
printf("社員番号%dの社員名は%sです。", emp.id, emp.name);
}
出力結果
社員番号1の社員名はSatoです。
typedefとは
-
typedef 定義されている型 定義する新しい型名;
という構文で、既に定義されている型に対して、別の新しい名前をつけて定義することができます。
Main.c
typedef int nk_int; /* int型をnk_int型という名前で再定義する */
typedefを使った例
- 構造体を宣言する箇所が
typedef struct 型名 {...} 新たな型名
という構文になっています。 - typedefを使う事により、
struct
キーワード無しで構造体Employee型の変数を宣言できます。- typedefを使った方が、main関数内がスッキリした感じがします。
- なお @SaitoAtsushi さんからのコメントによると、「構造体タグ名は省略してもかまわない」とのことですが、一方で「構造体タグが必要な場合は、型名と一致させるのがおそらく現代の主流だと思われる」とのことでした。
- @SaitoAtsushi さん、ご指摘ありがとうございました。
- 今回のコードでは、構造体タグ名と型名を一致させる形で書いています。
Main.c
#include <stdio.h>
typedef struct Employee { /* employee(社員)はタグ名 */
int id; /* 整数型のメンバ変数(社員番号) */
char* name; /* 文字列型のメンバ変数(社員名) */
} Employee; /* employee型をEmployee型として再定義する */
int main(void){
Employee emp;
emp.id = 1;
emp.name = "Sato";
printf("社員番号%dの社員名は%sです。", emp.id, emp.name);
}