
| 持っている変数 | 演算子 | 意味 | コードの例 |
構造体の実体 (例: 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言語では . の方が * よりも優先度が高いため、カッコがないとエラーになる。
このような複雑さを回避するためにアロー演算子ができたらしいので、アロー演算子を使うのがおすすめなのかも。