構造体配列をポインタで扱う手順は、一般の配列をポインタで扱う場合と全く同じです。
ポインタの使用手順を忘れてしまった人は「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