@ 연산자

@ 연산자

주소 연산자 @는 변수, 프로시저 또는 함수의 주소를 반환해요. 다음과 같이 사용해요.

출처: Free Pascal Reference - The @ operator

본문

@ 연산자는 $T 스위치가 켜져 있으면 타입이 있는 포인터(typed pointer)를 반환해요. $T 스위치가 꺼져 있으면 타입이 없는 포인터(untyped pointer)를 반환하는데, 이는 모든 포인터 타입과 대입 호환이 돼요. 포인터의 타입은 ^T인데, 여기서 T는 variable reference의 타입이에요. 예를 들어 다음은 컴파일돼요.

Program tcast;
{$T-} { @ returns untyped pointer }

Type art = Array[1..100] of byte;
Var Buffer : longint;
    PLargeBuffer : ^art;

begin
 PLargeBuffer := @Buffer;
end.

{$T-}{$T+}로 바꾸면 컴파일러가 이 코드를 컴파일하지 못해요. 타입 불일치 오류가 나게 되죠.

기본적으로 주소 연산자는 타입이 없는 포인터를 반환해요. 함수, 메서드 또는 프로시저 식별자에 주소 연산자를 적용하면 그 함수의 시작 지점(entry point)을 가리키는 포인터가 돼요. 결과는 타입이 없는 포인터랍니다.

즉, 다음은 동작해요.

Procedure MyProc;

begin
end;

Var
  P : PChar;

begin
  P:=@MyProc;
end.

기본적으로, 프로시저 타입 변수에 값을 대입해야 한다면 주소 연산자를 써야 해요. 이 동작은 -Mtp-MDelphi 스위치로 피할 수 있는데, 이 스위치들은 더 호환성 있는 Delphi 또는 Turbo Pascal 문법을 만들어 줘요.

더 알아보기

  • 프로시저 타입 변수에 대한 대입과 @의 관계는 함수 호출 섹션에서 다뤄요.
  • @가 타입이 있는/없는 포인터를 반환하는지 결정하는 $T 스위치는 관련 스위치 문서에서 확인할 수 있어요.