内容

構造体


構造体

C言語にはint型、float型、char型などの基本的なデータ型の他に構造体というデータ型がある。構造体はいろいろなデータ型を一まとめにして扱うための型である。例えば、住所録アプリケーションを作成しようとした場合、氏名、年齢、住所のデータが必要である。氏名、住所はchar型配列、年齢はint型のように異なったデータ型を、構造体を使うことにより1つの新しい構造体のデータ型に統合化し、それに対する構造体変数と呼ばれる変数を設定することで統一的に扱うことができる。

配列は複数の統一データ型を扱うものであったが、構造体は多くの種類のデータ型の変数や配列などを統一的に扱うことができる。

構造体を用いるには、まず構造体を定義し、その後構造体変数を宣言する。


構造体の定義

上の例の住所録データの氏名をchar型配列nameに、年齢をint型変数ageに、住所をchar型配列addressにそれぞれ格納するとした場合、この構造体の定義は次のように行う。

 

struct personal{
  char name[20];
  int age;
  char address[256];
};

 

構造体の要素、すなわち個々の変数、配列を構造体メンバーと呼ぶ。メンバーの宣言はこれまでのデータ型の宣言方法と同じである。はじめのstructは構造体を表し、その後のpersonalは構造体タグと呼ばれる。このタグは、この形の構造体の名前となる。これにより、新しい構造体に関するデータ型struct personalが定義される。


構造体の宣言

構造体struct personalというデータ型を使用するには、通常の変数と同様に宣言を行う必要がある。このため構造体変数と呼ばれる変数を用いる。構造体struct personalの構造体変数をtaroとすると、

 

struct personal taro;

 

とする。

これにより構造体struct personal型変数、taroが使用可能になる。

構造体の配列を作る場合、通常の変数と同様に以下のように宣言する。

 

struct personal a[10];

 


構造体メンバーの直接参照

構造体のメンバーを参照するには、構造体とメンバーを"."(ピリオド)で区切る。上の例の構造体の各メンバーに値を代入するには以下のように行う。

 

#include<stdio.h>

struct personal{
  char name[20];
  int age;
  char address[256];
};

main()

{
  
struct personal taro;

  scanf("%s", taro.name);
  
scanf("%d", &taro.age);
  
scanf("%s", taro.address);
}


構造体とポインタ

構造体も通常の変数と同じようにポインタによる操作が可能である。構造体のポインタ変数の宣言も通常の変数と同様である。

構造体ポインタのメンバーを参照するには"->"(マイナスと不等号)を用いる。

 

  struct personal *taro;

  printf("%s\n", taro->name);

 


構造体と関数

構造体を関数の引数として受ける場合、関数の引数は以下のようになる。

 

#include<stdio.h>

struct personal{
  char name[20];
  int age;
  char address[256];
};

void print_struct(struct personal pas)

{
  
printf("%s\n", pas.name);
  
printf("%d\n", pas.age);
  
printf("%s\n", pas.address);
}

main()
{
  
struct personal taro;

  scanf("%s", taro.name);
  
scanf("%d", &taro.age);
  
scanf("%s", taro.address);

  print_struct(taro);
}

 

また、構造体をポインタ渡しにする場合は以下のようになる。

 

#include<stdio.h>

struct personal{
  char name[20];
  int age;
  char address[256];
};

void print_struct(struct personal *pas)

{
  
printf("%s\n", pas->name);
  
printf("%d\n", pas->age);
  
printf("%s\n", pas->address);
}

main()

{
  
struct personal taro;

  scanf("%s", taro.name);
  
scanf("%d", &taro.age);
  
scanf("%s", taro.address);

  print_struct(&taro);
}

 

通常の変数型と同じように、関数の返り値を構造体にすることもできる。その場合は

 

  struct personal function(引数);

 

のように行う。