【C言語】構造体まとめ

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;
}


ポインタで混乱した人はこちらもどうでしょうか。

【C言語】ポインタまとめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です