- 読込のみ
-
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 );
}