構造体へのポインタ
前項(構造体の配列)では、惑星の軌道要素をまとまりとして、扱ってみましたが、 これを、「malloc」関数を利用して、ポインタ型として処理してみたいと思います。 内容的には、前項の「構造体の配列」と殆ど同じことを行っています。
構造体へのポインタは、間接演算子「*」を使って、参照することも出来ますが、
ポインタとして定義した構造体メンバへのアクセスは、「->」(矢印演算子)を使って下記のように行うことも出来ます。
plt1->planetnm = "earth";
ポインタとして定義した構造体の間接演算子での表記例=(*plt1).planetnm, (*plt1).a
#include <stdio.h> #include <stdlib.h> typedef struct { char *planetnm; /* 惑星の名称 */ double a; /* 長半径 */ double incln; /* 軌道傾斜角 */ int dist; /* 太陽からの距離 */ double revol; /* 公転周期 */ } planet; void planet_set(planet* ); /* 惑星の軌道要素の設定関数プロトタイプ宣言 */ void planet_out(planet* ); /* 惑星の軌道要素の表示関数プロトタイプ宣言 */ int main(void ) { planet *plt1; /* 構造体へのポインタ変数定義 */ /* 構造体の動的メモリ割付 */ plt1 = (planet*)malloc(sizeof(planet) * 5); planet_set(plt1 ); /*惑星の軌道要素の設定 */ planet_out(plt1 ); /* 惑星の軌道要素の表示 */ free(plt1); /* 構造体の動的メモリ解放 */ return 0; } |
planet_set関数では、ポインタを1つづつ進めて、各惑星のアドレス位置まで移動した後、 値を設定しています。又、構造体の始めのポインタ位置(アドレス)を記憶しておいて、 最後に、記憶しておいた最初の位置へ、ポインタを戻してやります。 planet_out関数でも、同様の方法で、ポインタ移動を行っています。
関数の詳細は、下記のソースファイルで、確認願います。