構造体配列をポインタで扱う手順は、一般の配列をポインタで扱う場合と全く同じです。
ポインタの使用手順を忘れてしまった人は「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; }
「初心者のためのポイント学習C言語」 Copyright(c) 2000-2004 TOMOJI All Rights Reserved