->
演算子は構造体ポインタのメンバへのアクセスに使用します。
文字A、文字Bだと少しわかりにくいので少し変数名とは変更しますが、以下のような構造体があるとして
// 構造体Hogeの定義
typedef struct {
int fuga;
char piyo[16];
} Hoge;
まず通常の構造体の宣言とアクセスは.
演算子を使用して次のようになるのはわかりますでしょうか?
Hoge hoge; // Hoge型の構造体hogeを宣言
// hogeのメンバに値を代入 (構造体へのアクセスは.演算子)
hoge.fuga = 1;
strcpy(hoge.piyo, "hoge.piyo");
// 出力して確認
printf("hoge1.fuga = %d, hoge1.piyo = %s\n", hoge.fuga, hoge.piyo);
次に構造体のデータをポインタでやり取りしたいと言うことはよくあるのですが、それをポインタの使い方通りに記述すると次のようになります。
Hoge *p_hoge = &hoge; // hogeのアドレスをp_hogeに代入
// ポインタの宛先の構造体にアクセス
(*p_hoge).fuga = 2;
strcpy((*p_hoge).piyo, "(*p_hoge).piyo");
// 元のhogeのデータが書き換わることを確認
printf("hoge.fuga = %d, hoge.piyo = %s\n", hoge.fuga, hoge.piyo);
これで問題なく使用はできるのですが、(*p_hoge)
といった書き方は少し書きにくく面倒なのでもっとかんたんで便利な書き方にしたのが->
演算子です。
(こういったものを糖衣構文(Syntax Sugar)といいます。)
// 構造体のメンバにポインタ経由でアクセス(->演算子)
p_hoge->fuga = 3;
strcpy(p_hoge->piyo, "p_hoge->piyo");
printf("hoge1.fuga = %d, hoge1.piyo = %s\n", hoge.fuga, hoge.piyo);
文字Aとい変数に文字Bにあたるアドレスを記憶させてるのでしょうか?
それとも文字Aの「文字Bのアドレス」を参照をしているだけなのでしょうか?
この書き方で言う文字A
はポインタなのでアドレスが格納されています。
文字B
は構造体のメンバです。
あえて文章的に書くと「文字A
の宛先にある構造体のメンバ文字B
」ということになります。