Rust : row pointer(生ポインタの使用例)
読込のみ
fn main() { let s = String::from( "XYZ" ); let slice = &s; let rp = slice.as_ptr(); // rp は u8 型の row pointer // unsafe{ *rp = 0x41u8; } // コメントを解除するとイミュータブルのためパニック発生 // 出力結果 >> 0x55a3f34e89d0 : 58 : XYZ println!( "{:?} : {:02X} : {}", rp, unsafe{*rp}, s ); }
書込可
fn main() { let mut s = String::from( "XYZ" ); let mut slice = &mut s; let mut rp = slice.as_mut_ptr(); // rp は u8 型の row pointer // 出力結果 >> 0x5641319669d0 : 0x58 : XYZ println!( "{:?} : 0x{:02X} : {}", rp, unsafe{*rp}, s ); unsafe{ *rp = 0x41u8; } // 書き込み可 // 出力結果 >> 0x5641319669d0 : 0x41 : AYZ println!( "{:?} : 0x{:02X} : {}", rp, unsafe{*rp}, s ); unsafe{ *rp.offset(1) = 0x42u8; } // 書き込み可 // 出力結果 >> 0x5641319669d0 : 0x42 : ABZ println!( "{:?} : 0x{:02X} : {}", rp, unsafe{*rp.offset(1)}, s ); }
値取得と同時にアドレスを進める CtlPtr トレイト
trait CtlPtr { fn next( &mut self, i : isize ) -> T; } impl CtlPtr for *mut T { fn next( &mut self, i : isize ) -> T { let x; unsafe { x = self.read(); *self = self.offset(i); } x } } fn main() { let mut s = String::from( "XYZ" ); let mut slice = &mut s; let mut rp = slice.as_mut_ptr(); // rp は u8 型の row pointer let x = rp.next(1); let y = rp.next(1); // 出力 >> x = X println!( "x = {:02X}", x ); // 出力 >> y = Y println!( "y = {:02X}", y ); }