Преобразование в uintptr

Преобразование в uintptr позволяет получить целочисленное значение указателя. Этот тип представляет собой целое число без знака, достаточно большое для хранения адреса памяти. Преобразование выполняется с помощью явного приведения типа uintptr(ptr), где ptr - указатель любого типа. Важно помнить, что uintptr - это просто число, а не указатель, и операции с ним не гарантируют безопасность работы с памятью.

Синтаксис

gouintptr(pointer)

Пример

Давайте получим числовое значение указателя на целое число:

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  num := 42
  ptr := &num
  addr := uintptr(unsafe.Pointer(ptr))
  fmt.Println(addr)
}

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

go"824633835104"

В результате мы получили числовой адрес переменной num в памяти.

Пример

Давайте выполним арифметические операции с адресом указателя:

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  arr := [3]int{10, 20, 30}
  ptr := &arr[0]
  addr := uintptr(unsafe.Pointer(ptr))
  fmt.Println(addr)

  nextAddr := addr + unsafe.Sizeof(arr[0])
  nextPtr := (*int)(unsafe.Pointer(nextAddr))
  fmt.Println(*nextPtr)
}

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

go"824633835104"
"20"

Мы получили адрес первого элемента, прибавили к нему размер элемента и получили указатель на следующий элемент массива.

Пример

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

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  a := 100
  b := 200
  ptrA := uintptr(unsafe.Pointer(&a))
  ptrB := uintptr(unsafe.Pointer(&b))

  if ptrA < ptrB {
    fmt.Println("a находится по меньшему адресу")
  } else {
    fmt.Println("b находится по меньшему адресу")
  }
}

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

go"b находится по меньшему адресу"

Мы сравнили числовые значения указателей и определили, какая переменная находится по меньшему адресу в памяти.

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

  • преобразование to-uintptr,
    которое преобразует значение в тип uintptr
  • преобразование pointer-conversion,
    которое описывает преобразования между указателями
  • преобразование to-uint,
    которое преобразует значение в тип uint
  • преобразование to-int,
    которое преобразует значение в тип int