サーチ…


構文

  • raw_ptr =&pointee as * const type //データへの定数生ポインタを作成する
  • raw_mut_ptr =&mutのpointeeを* mut 型にする //変更可能なデータへの変更可能な生ポインタを作成する
  • let deref = * raw_ptr //生ポインタを参照解除する(安全でないブロックが必要)

備考

  • 生ポインタは有効なメモリアドレスを指すことが保証されていないため、不注意な使用により予期しない(そしておそらく致命的な)エラーが発生する可能性があります。
  • 通常のRust参照(例えば、 my_objectの型がTの&my_object )は*const T強制されます。同様に、可変参照は*mut T強要する。
  • 生ポインタは所有権を移動しません(Box値とは異なります)

定数生ポインタの作成と使用

// Let's take an arbitrary piece of data, a 4-byte integer in this case
let some_data: u32 = 14;

// Create a constant raw pointer pointing to the data above
let data_ptr: *const u32 = &some_data as *const u32;

// Note: creating a raw pointer is totally safe but dereferencing a raw pointer requires an
// unsafe block
unsafe {
    let deref_data: u32 = *data_ptr;
    println!("Dereferenced data: {}", deref_data);
}

上記のコードが出力されます: Dereferenced data: 14

可変の生ポインタの作成と使用

// Let's take a mutable piece of data, a 4-byte integer in this case
let mut some_data: u32 = 14;

// Create a mutable raw pointer pointing to the data above
let data_ptr: *mut u32 = &mut some_data as *mut u32;

// Note: creating a raw pointer is totally safe but dereferencing a raw pointer requires an
// unsafe block
unsafe {
    *data_ptr = 20;
    println!("Dereferenced data: {}", some_data);
}

上記のコードは次のように出力されます: Dereferenced data: 20

生ポインタをnullに初期化する

通常のRust参照とは異なり、生ポインタはNULL値を取ることができます。

use std::ptr;

// Create a const NULL pointer
let null_ptr: *const u16 = ptr::null();

// Create a mutable NULL pointer
let mut_null_ptr: *mut u16 = ptr::null_mut();

チェーンの逆参照

Cと同じように、Rustの未加工のポインタは、他の未加工のポインタを指すことができます。

// Take a regular string slice
let planet: &str = "Earth";

// Create a constant pointer pointing to our string slice
let planet_ptr: *const &str = &planet as *const &str;

// Create a constant pointer pointing to the pointer
let planet_ptr_ptr: *const *const &str = &planet_ptr as *const *const &str;

// This can go on...
let planet_ptr_ptr_ptr = &planet_ptr_ptr as *const *const *const &str;

unsafe {
    // Direct usage
    println!("The name of our planet is: {}", planet);
    // Single dereference
    println!("The name of our planet is: {}", *planet_ptr);
    // Double dereference
    println!("The name of our planet is: {}", **planet_ptr_ptr);
    // Triple dereference
    println!("The name of our planet is: {}", ***planet_ptr_ptr_ptr);
}

これは出力されます: The name of our planet is: Earth 4回です。

生ポインタの表示

Rustには、ポインタを表示するために使用できるポインタ型のデフォルトのフォーマッタがあります。

use std::ptr;

// Create some data, a raw pointer pointing to it and a null pointer
let data: u32 = 42;
let raw_ptr = &data as *const u32;
let null_ptr = ptr::null() as *const u32;

// the {:p} mapping shows pointer values as hexadecimal memory addresses
println!("Data address: {:p}", &data);
println!("Raw pointer address: {:p}", raw_ptr); 
println!("Null pointer address: {:p}", null_ptr);

これは次のように出力されます:

Data address: 0x7fff59f6bcc0
Raw pointer address: 0x7fff59f6bcc0
Null pointer address: 0x0


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow