構造体のポインタを利用して、そのポインタが表す変数のメンバを使おうとすると、例えば、下のようにしたくなる。
xxxxxxxxxxstruct student { char namae[50]; char bangou[7]; int gakunen;};
struct student uriko;struct student *puriko;
strcpy(uriko.namae, "uriko");strcpy(uriko.bangou, "123456t");uriko.gakunen = 1;
puriko = &uriko;
printf("%d\n", *puriko.gakunen); // ポインタの表す変数のメンバにアクセスしたい.しかし、C言語では、演算の優先順位が決まっていたが、実は、「*」よりも「.」のほうが優先順位が高いので、*puriko.gakunenの部分は
xxxxxxxxxx*(puriko.gakunen)のように処理されてしまう。すると、purikoはポインタであって、構造体の変数ではないので、エラーとなってしまう。従って、
xxxxxxxxxx(*puriko).gakunenのように書かなくてはいけないが、毎回、このように書くのは面倒である。そこで、アロー演算子という構造体を表すポインタについて、そのポインタに対応する変数のメンバにアクセスすることが出来る演算子が定義されている。
構造体を示すポインタ->構造体のメンバ変数
上の例であれば、
xxxxxxxxxxpuriko->gakunenと書けばよい。これを使うと、構造体に含まれる変数を書き換えるプログラムが簡単にかけるようになる。
xxxxxxxxxx// struct6.c
struct student { char namae[50]; char bangou[7]; int gakunen;};
void change_grade(int g, struct student *pstu) { pstu->gakunen = g; // (*pstu).gakunen と書く代わりに、このように書いてよい. return;}
int main(void) { struct student uriko; struct student *puriko; struct student stu[2];
strcpy(uriko.namae, "uriko"); strcpy(uriko.bangou, "123456t"); uriko.gakunen = 1;
change_grade(2, &uriko); printf("%d\n", uriko.gakunen); // 2が表示される.
return 0;}神戸市の気温、降水量(単位位はmm)、日照時間(単位は時間)のデータを読み取り、平均気温を計算するプログラムを書き換え、気温、降水量、日照時間の各変数の平均を計算するプログラムを作成したい。そのようになるように、以下のプログラムを完成させよ。
// struct7.c
typedef struct { // ある時刻、ある場所における気温を保存する構造体 double kion; // 気温 double ame; // 降水量 double hare; // 日照時間} data;
void mean(data d[], int n, data *result) { // 平均値を求め、resultに記録する。 int i; double mkion = 0.0, mame = 0.0, mhare = 0.0;
for (i = 0; i < n; i++) { mkion += d[i].kion; mame += d[i].ame; mhare += d[i].hare; } mkion /= n;//このプログラムでは、'/='は左の変数を右の数値で割り、 //その結果を左の変数に格納します(つまり、自己割り当て) mame /= n; mhare /= n;
result->kion = mkion; result->ame = mame; result->hare = mhare;
return;}
int main(void) { int i; int n = 366; data dat[366]; data result; double d1, d2, d3; for (i = 0; i < n; i++) { scanf("%lf,%lf,%lf", &d1, &d2, &d3); // 入力は標準入力からとしておき、<を使う。 dat[i].kion = d1; dat[i].ame = d2; dat[i].hare = d3; } mean(dat, n, &result); printf("平均気温: %lf 平均降水量: %lf 平均日照時間: %lf\n", result.kion, result.ame, result.hare); return 0;}