15−3.構造体配列のポインタ表現

構造体配列をポインタで扱う手順は、一般の配列をポインタで扱う場合と全く同じです。

ポインタの使用手順を忘れてしまった人は「10-2.配列とポインタ」を確認してください。

ただし、構造体へのポインタを参照するためには、「構造体->メンバ名」のようにアロー演算子(->)を使う点に注意して下さい

#include <stdio.h>

struct seiseki {
	int no;
	char name[20];
	double heikin;
};

int main(void)
{
	int i;
	struct seiseki seito[20] = {
		{ 1, "SAKURAI", 78.6 },
		{ 2, "NAGANO", 57.3 },
		{ 3, "TAKESHITA", 66.4 },
	};
10-2. 配列とポインタ」で学習したように、ポインタが指す配列のデータは
*p や *(p + i) のように「*」で指定しましたね。
けれども上記の例でわかるように、ポインタが指す構造体のメンバは
(sp + i)->no や sp->no のように「*」 を使わず、
アロー演算子「->」を使って指定する点に注意してください。

【入れ子の構造体の場合】

入れ子の構造体をポインタを使って指定する場合は、一見「syomu->kyu->kihon」のようにアロー演算子を続けて用いそうですが、これは間違いです。 syomu のメンバである kyu はポインタではないのでアロー演算子ではなく、ドット演算子で結んでやらなければなりません。 ですから、「syomu->kyu.kihon」が正解となります。

15-2 で示した例をポインタを使って書きかえると下のようになります。

#include <stdio.h>

struct kyuuyo {		/* 給与 */
	long kihon;	/* 基本給 */
	long jyutaku;	/* 住宅手当 */
	long kazoku;	/* 家族手当 */
	long sikaku;	/* 資格手当 */
};
struct syain_dt {		/* 社員情報 */
	long no;		/* 社員番号 */
	char name[20];	/* 氏名 */
	char yaku[20];	/* 役職 */
	int nensu;	/* 勤続年数 */
	struct kyuuyo kyu;	/* 給与 */
};

int main(void)
{
	struct syain_dt syomu[20]= {	/* 庶務課 */
		{ 78027, "神保直樹", "課長", 21, 346780, 10000, 15000, 12000 },
		{ 84004, "相原彰子", "主任", 15, 223640, 10000, 0, 6000 },
		{ 87022, "本郷幸子", "",12, 208760, 10000, 0, 6000 },
		{ 0, "", "", 0, 0, 0, 0, 0 },
	};
	struct syain_dt *syomu_p;
	int i;
	
	syomu_p = syomu;
	
	for(i = 0; syomu_p->no != 0; i++) {
		printf("%s 総支給額 = %ld\n", 
			syomu_p->name,
			syomu_p->kyu.kihon + syomu_p->kyu.jyutaku + 
			syomu_p->kyu.kazoku + syomu_p->kyu.sikaku);
		syomu_p++;
	}
	
	return 0;
}
演習
◆◆前ページ  ▲TOP▲  次ページ◆◆

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