はじめに
- これまでの学習に続いて、今回は構造体配列について学んだ結果をまとめてみました。
学習環境
- 今回はpaiza.ioのC言語のエディタを使いました。
やりたい事
- 以下のような表形式で表されるデータを「構造体の配列」として処理したい。
- 「構造体の配列」を関数間で受け渡ししたい。
- 配列を関数に渡すと、配列へのポインタに自動的に読み替えられてしまうので、関数に要素数を一緒に渡すのが定石という情報がありましたが、これが一般的な実装かどうか分かりませんでした。
- そのため、今回は関数間での構造体配列の受け渡しは実装しませんでした。
社員番号 | 社員名 | 部署名 |
---|---|---|
1 | Sato | Sales |
2 | Suzuki | Development |
3 | Takahashi | Sales |
サンプルコード
- 社員名と部署名はこのコード中では変更されないので、
char*
ではなくconst char*
としました。- この点については @angel_p_57 さんのコメントに基づいて修正しました。
- 例えば「コード中で部署名が変更される可能性がある」という場合は
char*
になるのかもしれませんが、現時点ではよく分かりません。
main.c
#include <stdio.h>
// 構造体:社員型
typedef struct employee {
int id; // 社員番号
const char* name; // 社員名
char* deptName; // 部署名
} Employee;
int main(void){
// 社員リストの作成
Employee empList[3];
empList[0].id = 1;
empList[0].name = "Sato";
empList[0].deptName = "Sales";
empList[1].id = 2;
empList[1].name = "Suzuki";
empList[1].deptName = "Development";
empList[2].id = 3;
empList[2].name = "Takahashi";
empList[2].deptName = "Sales";
// 社員リストの表示
int arySize = sizeof(empList) / sizeof(Employee);
for (int i=0; i<arySize; i++) {
printf("社員番号:%d、社員名:%s、部署名:%s\n",
empList[i].id,
empList[i].name,
empList[i].deptName);
}
return 0;
}
実行結果
社員番号:1、社員名:Sato、部署名:Sales
社員番号:2、社員名:Suzuki、部署名:Development
社員番号:3、社員名:Takahashi、部署名:Sales
補足:構造体配列の初期化
- @angel_p_57 さんのコメントによると、以下のように構造体配列を初期化することもできるそうです。
- 実際に書いてみたところ、2番目の書き方の方がシンプルですが、1番目の書き方の方が間違いが無さそうです。
emplistの初期化(その1)
Employee empList[]={
{ .id=1, .name="Sato", .deptName="Sales", },
{ .id=2, .name="Suzuki", .deptName="Development", },
{ .id=3, .name="Takahashi", .deptName="Sales", },
};
emplistの初期化(その2)
Employee empList[]={
{ 1, "Sato", "Sales", },
{ 2, "Suzuki", "Development", },
{ 3, "Takahashi", "Sales", },
};