수색…


통사론

  • raw_ptr = & pointee as * const type // 일부 데이터에 상수 원시 포인터 생성
  • raw_mut_ptr = & mutant를 * mut 유형으로 지정합니다. // 일부 변경 가능한 데이터에 대해 변경 가능한 원시 포인터를 만듭니다.
  • let deref = * raw_ptr // 원시 포인터 역 참조 (안전하지 않은 블록 필요)

비고

  • 원시 포인터는 유효한 메모리 주소를 가리키는 것이 보장되지 않으므로 부주의하게 사용하면 예기치 않은 (또는 치명적인) 오류가 발생할 수 있습니다.
  • 모든 정상 녹 기준 (예. &my_object 유형 my_object T가된다)에 강요한다 *const T . 비슷하게, mutable 참조는 *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