РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
776 of 1245 menu

Трейт Pointer

Трейт Pointer из модуля std::fmt позволяет форматировать значения как адреса памяти. Он используется совместно со спецификатором {:p} в макросах форматирования, таких как println!, format! и других. Трейт реализован для ссылок и сырых указателей, а также для типов, которые автоматически приводятся к указателям. Параметров трейт не принимает - он лишь определяет метод fmt, который записывает адрес в переданный Formatter.

Синтаксис

use std::fmt; impl fmt::Pointer for MyType { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { // запись адреса в f } }

Пример

Давайте выведем адрес переменной с помощью спецификатора {:p}:

fn main() { let x = 5; let ptr = &x; println!("{:p}", ptr); }

Результат выполнения кода:

0x7ffd5e8a3b4c

Пример

Давайте выведем адрес строкового литерала через сырой указатель:

fn main() { let s = "abcde"; let ptr = s.as_ptr(); println!("{:p}", ptr); }

Результат выполнения кода:

0x55a1f2c3d040

Пример

Давайте реализуем трейт Pointer для собственной структуры:

use std::fmt; struct MyStruct { value: i32, } impl fmt::Pointer for MyStruct { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let ptr = self as *const MyStruct; fmt::Pointer::fmt(&ptr, f) } } fn main() { let s = MyStruct { value: 10 }; println!("{:p}", &s); }

Результат выполнения кода:

0x7ffc9a1b2c30

Смотрите также

  • макрос println!,
    который выводит данные в стандартный поток вывода
  • макрос format!,
    который создаёт отформатированную строку
  • спецификатор {:p},
    который используется для вывода указателей
  • трейт Debug,
    который отвечает за отладочное форматирование
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить