第15章 構造体

複数のデータをまとめて扱うには配列を用いましたが、配列では同じ型のデータしかまとめて扱う事はできません。

実際にプログラムを組んでいると、異なる型のデータをまとめて扱いたい場合がしばしばあります。 たとえば、学生の成績を扱うときに、int型の学生番号と、char型配列の氏名と、double型の点数をまとめて扱えれば便利だと思いませんか。

実は、この章で学習する「構造体」は幾つかの異なる型のデータをまとめて 1つのデータ型として扱うものなのです。


15−1.構造体の使用手順

サンプルプログラムを見ながら構造体の使用手順を説明します。

#include <stdio.h>

/* (1)構造体の型枠の宣言 */
struct seiseki {
	int no;		/* 学生番号 */
	char name[20];	/* 氏名 */
	double average;	/* 平均値 */
};

int main(void)
{
	int i;
	/* (2)構造体の宣言 */
	/* (3)構造体の初期化 */
	struct seiseki seito1 = { 5, "KASAHARA", 83.5 };
	struct seiseki seito2[20] = {
		{ 1, "SAKURAI", 78.6 },
		{ 2, "NAGANO", 57.3 },
		{ 3, "TAKESHITA", 66.4 },
	};
	
	/* (4)構造体の参照 */
	printf("%d %s %5.1f\n\n",seito1.no,seito1.name,seito1.average);
	for(i = 0; i < 3; i++) {
		printf("%d %s %5.1f\n",
			seito2[i].no, seito2[i].name, seito2[i].average);
	}
	
	return 0;
}
(実行結果)
5 KASAHARA  83.5

1 SAKURAI  78.6
2 NAGANO  57.3
3 TAKESHITA  66.4

(1)構造体の型枠の宣言

まず、複数のデータ(メンバと呼びます)をまとめて1つの構造体の型枠を宣言します。

この宣言は単に構造体の型を作ったにすぎず、領域の割当ては行われていません。

(書き方)

struct	タグ名 {
	データ型 メンバ名;
};
(例)
struct seiseki {
	int	no;
	char	name[20];
	double	average;
};
 この型枠の有効範囲は宣言する場所によって異なります。
関数外で宣言した場合 ⇒ その位置より下の全関数で有効
関数内で宣言した場合 ⇒ 宣言した関数内でのみ有効

(2)構造体の宣言

(1)で作った「型枠」を使って実際にデータを宣言し、メモリ上に領域を確保します。

構造体は「構造体変数」として 1つの構造体を扱う事も出来ますし、複数の構造体をまとめて「構造体配列」として扱う事も出来ます。

(書き方)

struct	タグ名 変数名の並び;
(例)
struct seiseki seito1;
struct seiseki seito2[20];

【例1.構造体変数の例】

seiseki という構造をもつ seito1 という「変数」を宣言

【例2.構造体配列の例】

seiseki という構造をもつ seito2 という「配列」を宣言

(3)構造体の初期化

構造体は一般の変数や配列同様、(2)の宣言時に合わせて初期化を行う事が出来ます。

  1. 構造体変数の初期化

    { } の間に、各メンバ名をカンマで区切って記述。

    struct seiseki seito1 = { 5, "KASAHARA", 83.5 };
  2. 構造体配列の初期化

    各配列要素ごとに、{ } で区切って記述。

    struct seiseki seito2[20] = {
    	{ 1, "SAKURAI", 78.6 },
    	{ 2, "NAGANO", 57.3 },
    	{ 3, "TAKESHITA", 66.4 },
    };
    

(4)構造体の参照

構造体の各メンバは、「構造体変数名. メンバ名」のようにピリオド(.)を用いて指定します。

この(.)を「ドット演算子」と呼びます。

  1. 構造体変数の参照
    printf("%d %s %5.1f\n\n", seito1.no, seito1.name, seito1.average);
    
  2. 構造体配列の参照
    for(i = 0; i < 3; i++) {
    	printf("%d %s %5.1f\n",
    		seito2[i].no, seito2[i].name, seito2[i].average);
    }
    
 構造体変数や構造体配列は通常の変数や配列と同様に扱われます。
ですから記憶クラスも同様に指定することが出来ます。
演習
◆◆前ページ  ▲TOP▲  次ページ◆◆

banner
「初心者のためのポイント学習C言語」
Copyright(c) 2000-2004 TOMOJI All Rights Reserved