Rust: offset祼指针操作

offset是偏移元素个数,不是字节数!

bash 复制代码
fn main(){
    let student_a = Student{id:20240001,name:"张三娃".into(),class_id:3,age:14,grade:1};
    let student_b = Student{id:20240002,name:"李四牛".into(),class_id:3,age:15,grade:1};
    let student_c = Student{id:20240003,name:"王二狗".into(),class_id:3,age:14,grade:1};
    let student_d = Student{id:20240004,name:"吴七喜".into(),class_id:3,age:24,grade:1};
    let students= vec![student_a, student_b, student_c, student_d];
    let class = Class{students,class_id:3,grade:1};
    let student_size = std::mem::size_of::<Student>(); // student结构体大小
    let student_align= std::mem::align_of::<Student>();//student内部对齐
    println!("student_size:{:?} student_align:{:?}",student_size,student_align);
    let class_ptr   = &class as *const Class;
    let student_a_ptr = &class.students[0] as *const Student;
    println!("student_a value :{:?}",unsafe{&*student_a_ptr as &Student});
    //let student_b_ptr = unsafe{ student_a_ptr.add(1)}; // 也可以用add这种方式
    // 注意:offset不是偏移字节数,而是偏移元素个数!
    let student_b_ptr = unsafe{ student_a_ptr.offset(1)}; // offset方式
    let offset_between_a_and_b = unsafe{student_a_ptr.offset_from(student_b_ptr)};
    println!("offset_between_a_and_b:{}",offset_between_a_and_b);// -1
    println!("student_b value name :{:?}",unsafe{&*student_b_ptr as &Student}.name);
    //let student_c_ptr = unsafe{ student_a_ptr.add(2)};
    let student_c_ptr = unsafe{ student_a_ptr.offset(2)};
    let student_d_ptr = unsafe{ student_a_ptr.offset(3)};
    println!("student_b ref ptr address : {:p} convert raw ptr address : {:?}",&class.students[1],student_b_ptr);
    println!("student_b ref ptr address : {:p} convert raw ptr address : {:?}",&class.students[2],student_c_ptr);
    println!("student_b ref ptr address : {:p} convert raw ptr address : {:?}",&class.students[3],student_d_ptr);

}
// 某某中学
// 班级
struct Class{
    students: Vec<Student>,//学生
    class_id: u32, //3班
    grade:u32, //高3
}
#[derive(Debug)]
struct Student{
    id: u32, //学号 2024000001;
    name: String, // 姓名,name="张三"
    class_id: u32, //班级,class_id=3,3班
    age: u32, //年龄
    grade: i8, //年级,grade=1,高中一年级
}

输出:

bash 复制代码
student_size:40 student_align:8
student_a value :Student { id: 20240001, name: "张三娃", class_id: 3, age: 14, grade: 1 }
offset_between_a_and_b:-1
student_a value :Student { id: 20240001, name: "张三娃", class_id: 3, age: 14, grade: 1 }
offset_between_a_and_b:-1
offset_between_a_and_b:-1
student_b value name :"李四牛"
student_b ref ptr address : 0x1c2ff7f6f48 convert raw ptr address : 0x1c2ff7f6f48
student_b ref ptr address : 0x1c2ff7f6f70 convert raw ptr address : 0x1c2ff7f6f70
student_b ref ptr address : 0x1c2ff7f6f98 convert raw ptr address : 0x1c2ff7f6f98

其实,你可以通过offset函数源码,可以了解更清楚,在offset内部,会再以bytes的倍数进行check_add。

相关推荐
恣艺1 分钟前
LeetCode 123:买卖股票的最佳时机 III
算法·leetcode·职场和发展
geoyster19 分钟前
20250802-102508010-CP
算法
Q741_14732 分钟前
优选算法 力扣 202.快乐数 快慢双指针 解决带环问题 C++解题思路 每日一题
c++·算法·leetcode·快慢双指针·环形问题
DONG91332 分钟前
Python 中的可迭代、迭代器与生成器——从协议到实现再到最佳实践
开发语言·汇编·数据结构·python·算法·青少年编程·排序算法
R-G-B41 分钟前
【C++ 初级工程师面试--4】形参带默认值的函数,特点,效率,注意事项
开发语言·c++·形参带默认值的函数·形参默认值特点,效率,注意事项·形参默认值特点·形参默认值效率·形参默认值注意事项
Q_Q5110082851 小时前
python的驾校培训预约管理系统
开发语言·python·django·flask·node.js·php
GeekPMAlex1 小时前
RAG 02 多模态检索 多维主键
算法
CoovallyAIHub1 小时前
只有2MB,却能跑满277FPS?专为无人机小目标打造!
深度学习·算法·计算机视觉
金宗汉1 小时前
文明存续的时间博弈:论地球资源枯竭临界期的技术突围与行动紧迫性
大数据·人工智能·笔记·算法·观察者模式
Dxy12393102161 小时前
Python正则表达式使用指南:从基础到实战
开发语言·python·正则表达式