水瓶座列車

どこまで行けるか、とりあえず発車します。

C言語の構造体について解説

f:id:aquarius999:20210406001949p:plain

 

配列は、同一の型でデータを管理していますが、

構造体は、異なった型を集合体にしてデータを管理することができるものです。

構造体を理解できるとC++のようなオブジェクト指向言語にも考え方を活かすことができます。

C++でいうと、構造体はメンバ変数が全てpublicのクラスと言えます。クラスの解説については、今度の機会にしたいと思います。

また、C言語の参考書などでは、構造体と一緒に共用体も説明されていますが、

ここでは、共用体については解説せず、構造体のみにしたいと思います。 

それでは、C言語の構造体について解説していきます。 

 

 

 

 

 

  1.構造体とは

 

構造体は、異なる変数型の変数をグループ化してデータ管理するものです。 

変数をグループ化することによって、変数毎ではなく構造体の変数として、

複数の変数を一度に扱うことができます。

また、構造体を理解しておくと、C++のクラス構造を勉強する時にもイメージがしやすくなります。 

 

  2.構造体の定義と宣言のやり方

 

構造体の定義は、以下のようにstruct型で記述し、その後に構造体名を付けます。

struct (構造体名)

 

構造体の定義と宣言のやり方は、3種類あります。

1つ目は、こんな感じです。

struct person {
int age;
char name[20];
int height;
  int weight;
};

main {
  struct person tarou, jirou;
}

最初に構造体の中身を定義しておき、person構造体変数のtarouとjirouを宣言しています。

 

2つ目は、 こんな感じです。 

struct person {
  int age;
  char name[20];
  int height;
  int weight;
} tarou,jirou;

main {
  :
}

person構造体の定義と同時に構造体変数のtarouとjirouも宣言することができます。

 

3つ目は、こんな感じです。

typedef struct person {
  int age;
  char name[20];
  int height;
  int weight;
} PERSON;

main {
  PERSON tarou;
}

structの前にtypedefを入れて、PERSONというtypedef定義の構造体名を宣言しています。

typedef定義をすると「struct person」の部分を「PERSON」に置き換えることができます。

宣言の仕方は、main()関数に記述しているような形になります。

 

  3.構造体のメンバ変数にアクセスするやり方

 

構造体のメンバ変数にアクセスするやり方は、

構造体変数からのアクセスと構造体ポインタからのアクセスがあり、それぞれやり方を解説していきます。

 

構造体変数からメンバ変数にアクセスする。

 

構造体変数名の後に、「.」(ドット)を付けて続けてメンバ変数名をを記述することで、

そのメンバ変数にアクセスすることができます。 

#include <stdio.h>
#include <string.h>

struct person {
  int age;
  char name[20];
  int height;
  int weight;
};

main {
  struct person tarou;      // 構造体変数tarouを宣言
 
  tarou.age = 20;         // 構造体変数tarouのメンバ変数ageに値を設定
  strcpy( tarou.name[],"tarou"); // 構造体変数tarouのメンバ変数nameに値を設定
  tarou.height = 164;       // 構造体変数tarouのメンバ変数heightに値を設定
  tarou.weight = 70;        // 構造体変数tarouのメンバ変数weightに値を設定

  printf("tarou age: %d\n", tarou.age);
  printf("tarou name: %s\n", tarou.name);
  printf("tarou height: %d\n", tarou.height);
  printf("tarou weight: %d\n", tarou.weight);
}

 

構造体変数のポインタでアクセスする。

 

先ほどの構造体変数では、「ドット」を使用しましたが、

構造体ポインタからのメンバ変数のアクセスには、「->」を使用します。  

#include <stdio.h>
#include <string.h>

struct person {
  int age;
  char name[20];
  int height;
  int weight;
};

main {
  struct person *tarou;      // 構造体ポインタ変数tarouを宣言
 
  tarou->age = 20;         // 構造体変数tarouのメンバ変数ageに値を設定
  strcyp( tarou->name[],"tarou"); // 構造体変数tarouのメンバ変数nameに値を設定
  tarou->height = 164;       // 構造体変数tarouのメンバ変数heightに値を設定
  tarou->weight = 70;       // 構造体変数tarouのメンバ変数weightに値を設定

  printf("tarou age: %d\n", tarou->age);
  printf("tarou name: %s\n", tarou->name);
  printf("tarou height: %d\n", tarou->height);
  printf("tarou weight: %d\n", tarou->weight);
}

 

 

 

 

  4.構造体配列について

 

int型やchar型と同じように、構造体も配列にすることができます。

構造体配列の中でも構造体ポインタを配列にすることで、かなり応用が利くようになります。

上記2項で使用した構造体personを配列にしてみます。

例えば、学校のクラスの生徒を管理することをイメージすると分かりやすいと思います。

 

#include <stdio.h>
#include <string.h>

struct person {
  int age;
  char name[20];
  int height;
  int weight;
};

main {
  struct person AClass[5];      // 構造体配列AClassを宣言
 
  AClass[0].age = 20;         // 構造体配列の要素0のageに値を設定
  strcpy( AClass[0].name[],"tarou"); // 構造体配列の要素0のnameに値を設定
  AClass[0].height = 164;       // 構造体配列の要素0のheightに値を設定
  AClass[0].weight = 70;       // 構造体配列の要素0のweightに値を設定

  printf("AClass 0 age: %d\n", AClass[0].age);
  printf("AClass 0 name: %s\n", AClass[0].name);
  printf("AClass 0 height: %d\n", AClass[0].height);
  printf("AClass 0 weight: %d\n", AClass[0].weight);
}

 

構造体配列は、他の型の配列と同様に、要素に対して操作することができます。

 

  5.最後に

 

構造体は、かなりの頻度で使用しますので、確実理解しておいた方が良いです。

ポインタと合わせて良く使用されますし、構造体配列もイメージができると他の言語にも応用が利きます。

 

 

 

 

関連・おすすめ記事

プログラミングを独学で勉強するためのLinuxパソコン準備手順 - 水瓶座列車

C言語の始め方と基本構造、コンパイルから実行までを解説 - 水瓶座列車

C言語のデータ型と変数、関数について解説 - 水瓶座列車

C言語の繰り返し構文( while, do while, for )の解説と応用 - 水瓶座列車

C言語の演算子と優先順位の解説 - 水瓶座列車