構造体へのポインタを保存する方法は、通常の変数と同じです。構造体の宣言で、ポインタ宣言子 * を使ってください。
struct
{
char m1;
char m2;
} *p ;
構造体へのポインタ p が上記のように存在すると仮定し、p からメンバにアクセスするには、間接演算子を通して構造体の実体を取得する必要があります。
(*p).m1
このとき、演算子の優先順位に注意してください。*p.m1 と記述した場合は *(p.m1) と解釈されてしまいます。
構造体へのポインタからメンバにアクセスするときに、構造体の実体を間接演算子 * で取得してメンバにアクセスするのは手間がかかります。そこで、アロー演算子 -> を使うことで上記と同じ結果を得られます。アロー演算子の左オペランドには構造体へのポインタを、右オペランドにアクセスするメンバを指定します。
p->m1
一般的には、構造体へのポインタからメンバにアクセスするにはアロー演算子 -> を使います。構造体へのポインタが頻繁に使われることから、アロー演算子は便宜上の都合で用意されています。アロー演算子を使った p->m1 という式は、(*p).m1 と等価です。
Sample08
#include <stdio.h>
int main(void)
{
struct
{
char m1;
char m2;
} s = { 'A', 'B' }, *p ;
p = &s;
printf("s.m1=%c, s.m2=%c\n", s.m1, s.m2);
printf("(*p).m1=%c, (*p).m2=%c\n", (*p).m1, (*p).m2);
printf("p->m1=%c, p->m2=%c\n", p->m1, p->m2);
return 0;
}
実行結果
サンプル08の実行結果 |
Sample08 は、構造体 s へのポインタを p に保存し、ポインタ p から構造体 s のメンバにアクセスしています。このとき、間接演算子 * を使った (*p).m1 といった記法と、アロー演算子 p->m1 といった記法でそれぞれのメンバを表示しています。得られた結果から (*p).m1 と p->m1 の結果が同じであることが確認できます。