構造体演算子の違い(ドット演算子orアロー演算子)

持っている変数演算子意味コードの例
構造体の実体 (例: node tmp;). (ドット)実体から直接中身を見るtmp.type
構造体へのポインタ (例: node *ptr;)-> (アロー)住所を辿ってから中身を見るptr->type

ドット演算子

コード例

int main(void)

{

node tmp;

tmp.type = VAL;

tmp.val = 5;

tmp.l = NULL;

tmp.r = NULL;



printf("type: %d, val: %d\n\n", tmp.type, tmp.val); // type:2 val:5
return 0;
}

ここではtmpは実体。

だから構造体へはドット演算子を使う。

スタック領域の tmp
目の前にある実体の箱(tmp)に対しては、直接手を出して tmp.type = VAL; のように . を使って値を書き込める。

アロー演算子

コード例

int main(void)

{

node *heap_node = new_node(tmp); //heap_nodeがどこかにmallocしたヒープ領域を指す

if (!heap_node)

return (printf("メモリ確保に失敗"), (1));



heap_node->type = VAL;

heap_node->val = 10;

heap_node->l = NULL;

heap_node->r = NULL;


printf("type: %d, val: %d\n\n", tmp.type, tmp.val); // type:2 val:10

return (0);

}

このとき、heap_nodeはポインタである。

node本体ではなく、nodeの場所を知っているだけ。

だからアロー演算子を使う。

ヒープ領域の heap_node
new_node から返ってきたのは「新しく確保されたメモリの場所(住所)」なので、そこへアクセスするために heap_node->type = 10;-> を使って正しく値を書き換えられる。

実体であればドット演算子を使えるということは….

デリファレンスしてドット演算子を使うのも正解(デリファレンスするということは実体を表すのでドット演算子を使えるということ。)。

(例)(*heap_node).type=VAL

しかし、C言語では . の方が * よりも優先度が高いため、カッコがないとエラーになる。
このような複雑さを回避するためにアロー演算子ができたらしいので、アロー演算子を使うのがおすすめなのかも。