Rust和C/C++访问结构体中值的指针之间的比较

ql3eal8s  于 2023-05-17  发布在  C/C++
关注(0)|答案(1)|浏览(169)

一些简单的Rust code

struct Point {
    x: f64,
    y: f64,
}

fn main() {
    let p: &Point = &(Point { x: 0.3, y: 0.4 });
    // println!("{:?}" , p->x); // no sugar here for Rust
    println!("{:?}", (*p).x);
    println!("{:?}", p.x); // sugar?
    // no leak right? thanks Rust
}

类似的C code

#include <stdio.h> 
#include <stdlib.h> 

typedef struct Point Point; 

struct Point {
    float x;
    float y; 
};

int main() {
    Point __tmp = { 0.3, 0.4 };
    Point* p = &__tmp;

    printf("%f\n", p->x); // C sugar for below
    printf("%f\n", (*p).x);
    // below doesn't work because p is a pointer to a point
    //printf("%f", p.x); // error: request for member 'x' in something not a structure or union
    // memory leak at this point right?
    return 0; 
}

在这两段代码中,p似乎都是指向Point的指针。
我想确保Rust实现p.x是(或者可以被认为是)语法糖,并且我对正在发生的事情没有根本的误解。
这就是他们所说的“别名”吗?Rust中的p更像是一个别名吗?

whhtz7ly

whhtz7ly1#

p.x在某种意义上确实是糖。Rust在进行方法/属性查找时,自动取消引用任何实现了trait DerefDerefMut的类型(取决于上下文是否需要可变或不可变引用)。
在您的示例中,引用&Point实现了Deref<Target=Point>,因此您的p.x表达式扩展为(*p).x。请注意,只有当指针类型没有自己的名为x的属性/方法时(简单引用不是这种情况),这才有效。
another question on SO继续关于自动取消引用的详细规则。

相关问题