Skip to content

指针

Rust作为系统级别的语言,抛弃指针是完全不现实的。

但Rust作为一门现代安全语言,一门现代语言会尽可能的抛弃指针。

指针的概念

在Rust中,指针实际上就是地址,我们可以将符号 & 放在变量名前,表示这个数据类型是一个指针。

rust
let x = 5;
println!("{:p}", &x);
// 0x16bd0652c
rust
// `&` 后面跟的变量名,就是这个指针指向的数据。
let x = 5;
let y: &i32 = &x;   // y -> &x -> x=5
println!("{:p}", y);
println!("{:?}", y);
println!("{:}", x);

指针变量

rust
// 指针变量的赋值
let (x, y) = (1, 2);
let mut p: &i32 = &x;
println!("{:p} -> {0}", p);
p = &y;
println!("{:p} -> {0}", p);
// 0x16f57a3f0 -> 1
// 0x16f57a3f4 -> 2
rust
// 得到指针变量的大小
let x = 5;
let p: &i32 = &x;
// 输出指针变量的大小
println!("{:?}", std::mem::size_of_val(&p));
// 输出8 和操作系统相关

let y = true;
let p: &bool = &y;
println!("{:?}", std::mem::size_of_val(&p));
// 输出8 和操作系统相关
rust
// 得到指针变量所指变量的值
let x = 5;
let p: &i32 = &x;
println!("{:?}", *p);
// 输出5
rust
let mut x = 5;
let p: &mut i32 = &mut x;
*p = 6;
*p = 7;
println!("{:?}", x);
rust
fn swap(a: &mut i32, b: &mut i32) {
    let tmp = *a;
    *a = *b;
    *b = tmp;
}
fn main() {
    let mut a = 5;
    let mut b = 6;
    
    let pa = &mut a;
    let pb = &mut b;
    
    println!("a={:?}, b={:?}", a, b);
    
    // 交换a和b
    swap(pa, pb);
    
    // 打印a和b
    println!("swaped: a={:?}, b={:?}", a, b);
}
rust
fn my_func(q: &mut i32) -> &mut i32 {
    *q = 32;
    println!("in myfunc q's value:{:p}", q);
    q   // 返回指针
}

fn main() {
    let mut x = 5;
    println!("x is {:p}", &x);
    let p = &mut x;
    println!("p is {}", p);
    println!("out myfunc p's value:{:p}", my_func(p));
    println!("out myfunc p's value:{}", *my_func(p));
}

// x is 0x16cf4e39c
// p is 5
// in myfunc q's value:0x16cf4e39c
// out myfunc p's value:0x16cf4e39c
// in myfunc q's value:0x16cf4e39c
// out myfunc p's value:32

函数指针

Rust中,函数指针和指针一样,也是指针。

rust
fn add(a: i32, b: i32) -> i32 {
    a + b
}
fn main() {
    let p: fn(i32, i32) -> i32 = add;
    println!("{:p}", p(1, 2));
}
rust
fn add(a: i32, b: i32) -> i32 {
    a + b
}
fn my_func(p: fn(i32, i32) -> i32, arg: i32, arg2: i32) -> i32 {
    p(arg, arg2)
}
fn main() {
    println!("{:?}", my_func(add, 1, 1));
}

人生感悟