C言語の構造体の書き方を忘れた型向けにまとめました。
typedefの書き方や関数へポインタで渡すなどの使用例をのせています。
構造体型の宣言方法(2通り)
書き方に少し違いがあるだけで中身は同じです。
構造体型名は大文字にする慣習があります。
普通にstructを使う
#include <stdio.h>
struct Car{
char name[30];
int price;
double weight;
}; //ここに ; をつけるのを忘れないように
int main(void){
struct Car car1 = {"aiueo", 200, 1000.0};//Car型の変数car1の宣言
//{ }で初期化はしなくてもよい。
printf("値段は%d万円です\n", car1.price);//このようにメンバの値を使える
return 0;
}
typedefを使う方法
#include <stdio.h>
typedef struct Car{
char name[30];
int price;
double weight;
} Car; //ここに 構造体型名; をつけるのを忘れないように
int main(void){
Car car1 = {"aiueo", 200, 1000.0};//structを始めに付けなくてよくなる
//{ }で初期化はしなくてもよい。
printf("値段は%d万円です\n", car1.price);//このようにメンバの値を使える
return 0;
}
typedefを使うと、1つめの方法でstruct Carと書かなければいけなかったところを、Carと書くだけでよくなるというところに利点があります。
それ以外に違いはありません。
ただし、微妙に書き方が違うところがあるので、特に宣言時などは細かい書き方の違いには注意してください。
構造体変数をポインタでいっきに渡して使う
(ポインタで渡す理由は、構造体の変数が大きくなるほどコピーに無駄なメモリや時間がかかるからです。)
使用例のコードは以下になります。
#include <stdio.h>
typedef struct Car{
char name[30];
int price;
double weight;
} Car; //ここに 構造体型名; をつけるのを忘れないように
void show(Car *car){
printf("%sの値段は%d万円、重量は%fトンです。\n", car->name, car->price, car->weight);
}
int main(void){
Car car1;
printf("車の名前を入力してください:");
scanf("%s", car1.name);
printf("車の値段を入力してください(万円):");
scanf("%d", &car1.price);
printf("車の重量を入力してください(トン):");
scanf("%lf", &car1.weight);
show(&car1);
return 0;
}
構造体へのポインタ名にアロー演算子 -> を使っていますが、
car->price と (*car).price と car[0].price は同じ結果になります。
何でもいいと思います。
構造体を配列にして使う
また、構造体変数を配列にすることもできます。
使用例のコードは以下になります。
#include <stdio.h>
typedef struct Student{
double height;
double weight;
char blood_type[3];
} Student;
void show_students(int N, Student *students){
for(int i=0; i<N; i++){
printf("%d 身長:%f, 体重:%f, 血液型:%s\n", i+1, students[i].height, students[i].weight, students[i].blood_type);
}
}
int main(void){
int N;
printf("何人の生徒の情報を入力しますか:");
scanf("%d", &N);
Student students[N];//構造体の配列を宣言
for(int i=0; i<N; i++){
printf("%d番目の生徒の身長は:", i+1);
scanf("%lf", &students[i].height);
printf("%d番目の生徒の体重は:", i+1);
scanf("%lf", &students[i].weight);
printf("%d番目の生徒の血液型は(アルファベット大文字):", i+1);
scanf("%s", students[i].blood_type);
}
show_students(N, students);
return 0;
}
ポインタで混乱した人はこちらもどうでしょうか。