타입변환을 읽고 있는데요?
<!--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)^;
에서 ^의 의미는 뭐이며, ^가 앞에 오는것과 뒤에오는것은 어떤차이점이 있는지?
풍성한 한가위 되시기 바랍니다.
위의 경우는 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의) 주소를 가져오는 일 뿐입니다.