構造体へのポインタを保存する方法は、通常の変数と同じです。構造体の宣言で、ポインタ宣言子 * を使ってください。

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 の結果が同じであることが確認できます。