Q&A

  • 오브젝트 파스칼을 공부하고 있습니다.
타입변환을 읽고 있는데요?
<!--CodeS-->
type
   TByteRec = record
      Lo, Hi: Byte;
   end;
   TWordRec = record
        Low, high:Word;
   end;
   PByte = ^Byte;
var
   B:Byte;
   W:Word;
   L:Longint;
   P:Pointer;
begin
   W := $1234;
   B := TByteRec(W).Lo;
   TByteRec(W).Hi := 0;
   L := $01234567;
   W := TWordRec(L).Low;
   B := TByteRec(TWordRec(L).Low).Hi;
   B := PByte(L)^;
end;
<!--CodeE-->

위의 소스코드가 예로 되어있는데요?
PByte = ^Byte, B := PByte(L)^;
에서 ^의 의미는 뭐이며, ^가 앞에 오는것과 뒤에오는것은 어떤차이점이 있는지?

풍성한 한가위 되시기 바랍니다.
2  COMMENTS
  • Profile
    전명재 2006.10.05 00:20
    PByte = ^Byte;

    위의 경우는  Byte 타입의 포인터형, 즉 바이트포인터형으로  
    PByte라는 새로운 타입을을 선언하는 겁니다, 그래서..

    a: PByte;  
    위처럼 a 를 선언할 경우 이것은 바이트형태의 포인터로 a 를 선언한 것과 같습니다.

    a: pointer;
    이렇게 선언하고 a에 값을 넣을때 byte(a^) := 10; 이렇게 하는것 보다는
    a: PByte;
    a^ := 10; 이렇게 쓰는게 더 간략하죠.

    그리고 ^ 가 뒤에 오는 경우는 포인터 타입으로 선언된 변수에 값을 입력할때 씁니다
    a^ := 10;  위에 이렇게 쓴것 처럼..

    a: PByte;
    이렇게 선언하면 일단 a 는 포인터 형태입니다,
    즉.. 특정 메모리의 주소를 보관하게 됩니다.
    하지만 a^ 로 참조를 하면 a가 갖고있는 주소에 값을 기록해라..
    뭐 이정도로 이해 하시면 편합니다.

    a: integer;
    b: pointer;

    a := 10;    
    b := @a;
    b^ := 20;

    우선 a에 10을 넣고
    b에 a의 주소를 대입합니다 '@' 골뱅이는 at 이고, at은 영어에서도 위치를 지정할때 쓰죠!?  ^^
    그래서 @a 는 a의 주소를 뜻하게 됩니다.
    마지막으로 b가 가지고 있는 주소(a의 주소)에 20을 넣습니다.

    결과는 a의 값이 20이 됩니다.

    포인터를 많이 헛갈리시는 분들이 계신데..
    그냥 "포인터 = 우체부" 정도로 이해하시는게 도움이 됩니다.

    일단 편지를 친구에게 보내려면 친구의 주소만 알고 있으면 됩니다.
    편지를 쓰고 봉투에 주소를 써서 우편함에 넣어두기만 하면 되죠.
    편지는 우체부가 알아서 전달해 줄 겁니다.

    포인터랑 살짝 다른점은 미리 친구의(a의) 주소를 가져오는 일 뿐입니다.

  • Profile
    박성준 2006.10.05 03:07
    감사합니다.
    즐거운 한가위 되세요.