66248


Rustを学習中です。参照についてあまりピンときていません。参照はC言語のポインタに借用の概念をもたせたものとして理解していたのですが、その場合次の例がなぜ動くのかがわかりません。

[code]

    struct Point {x: i32, y: i32}
    
    fn main() {
        let a = Point{x: 100, y: 230};
        let b = &a;
        println!("{} {}", a.x, a.y);
        println!("{} {}", b.x, b.y);
    }
    
[/code]

これはどちらも`100 230`を出力します。しかしbはaのポインタなので、`.`でメンバ変数にアクセスできるのはおかしいのではないかと思いました。  
実際Cではアロー演算子を用いてアクセスします。

[code]

    #include <stdio.h>
    #include <stdlib.h>
    
    struct Point{
        int x;
        int y;
    };
    int main() {
        struct Point a, *b;
        a.x = 3;
        a.y = 4;
        printf("%d %d\n", a.x, a.y);
        b = &a;
        printf("%d %d\n", b->x, b->y);
        return 0;
    }
    
[/code]

Rustでもアロー演算子のようなものが使われているのではないかと検索してみましたが出てきませんでした。また、明示的に参照を解決しても動きます。

[code]

    struct Point {x: i32, y: i32}
    
    fn main() {
        let a = Point{x: 100, y: 230};
        let b = &a;
        println!("{} {}", (*b).x, (*b).y);
        println!("{} {}", a.x, a.y);
    }
    
[/code]

構造体だけでなく&VecでもVecと同じように使用できています。

[code]

    fn main() {
        let a = vec![1,2];
        let b = &a;
        println!("{}", b[0]);
        println!("{}", (*b)[0]);
    }
    
[/code]

参照の場合は借用が目的で使われるため、ポインタのように指し示す値がアドレスであることを意識しないように自動的に参照外しが行われていると考えればよいのでしょうか？  
ご教授お願いします。

参考

  * [Rustのポインタ（所有権・参照）・可変性についての簡単なまとめ - Qiita](https://qiita.com/nebutalab/items/1d7a03c36c087c3f6360#%E4%BD%99%E8%AB%87%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E3%81%AE%E8%A6%81%E7%B4%A0%E3%81%AE%E6%89%B1%E3%81%84)
  * [rustでvectorから値を取り出そうとすると、cannot move out of indexed content - Qiita](https://qiita.com/kanna/items/109bd9c972b224a341b5)


CC BY-SA 4.0
2020-05-03T09:49:22.400
66243
2020-05-03T15:29:47.170
20533
question
rust ポインタ
Rustの参照(借用)とポインタの違いについて


Rust ではドット `.` を使った際に自動的に dereference および reference してくれる機能が入っています。具体的には、`b.x`
と書いたときに `b` に `x` が見つからなければ、適宜 `&`、`&mut`、`*` をつけながら探索してくれます。このため C のようにドット
`.` とアロー `->` の違いをあまり意識せずにコードを書けます。

詳しくは以下のマニュアルをご覧ください（上から 1 つ目と 2 つ目はメソッド呼び出しに関するマニュアルですが、3
つ目を読めば分かるようにフィールドへのアクセスと同様の話になっています）：

  * [Method Syntax](https://doc.rust-lang.org/1.30.0/book/second-edition/ch05-03-method-syntax.html) \-- The Rust Programming Language
  * [Method-call expressions](https://doc.rust-lang.org/reference/expressions/method-call-expr.html) \-- The Rust Reference
  * [Field access expressions](https://doc.rust-lang.org/reference/expressions/field-expr.html) \-- The Rust Reference


CC BY-SA 4.0
2020-05-03T12:16:37.000
66248
2020-05-03T15:29:47.170
2020-05-03T15:29:47.170
19110
19110
66243
answer