pointerof

pointerof (주소 얻기)

변수나 상수의 값을 바꾸기 위해 그 메모리 주소를 직접 다뤄야 할 때가 있어요. pointerof 표현식은 변수나 상수의 내용을 가리키는 Pointer를 반환해요.

출처: Crystal 공식 문서 - pointerof

본문

pointerof 표현식은 변수나 상수의 내용을 가리키는 Pointer를 반환해요.

지역 변수를 사용한 예시를 볼게요.

a = 1

ptr = pointerof(a)
ptr.value = 2

a # => 2

pointerof(a)로 얻은 포인터 ptrptr.value = 2로 값을 쓰면, 포인터가 가리키는 원래 변수 a의 값이 2로 바뀌어요. 포인터를 통해 직접 메모리를 건드리는 셈이죠.

인스턴스 변수에서도 동일하게 동작해요.

class Point
  def initialize(@x : Int32, @y : Int32)
  end

  def x
    @x
  end

  def x_ptr
    pointerof(@x)
  end
end

point = Point.new 1, 2

ptr = point.x_ptr
ptr.value = 10

point.x # => 10

pointerof는 포인터와 관련되어 있기 때문에 unsafe한 연산으로 간주돼요. 포인터를 직접 다루는 만큼 메모리 안전성에 주의해야 해요.

더 알아보기

  • 포인터가 왜 unsafe한지 포함해 unsafe한 코드 전반은 Unsafe code 문서에서 다뤄요.
  • C 함수에 값을 넘길 때 자동 변환을 활용하려면 to_unsafe 문서를 확인해 보세요.