PAnsiChar
type PAnsiChar = ^AnsiChar;
타입을 보시면 아시겠지만 AnsiChar의 포인터 형입니다. 포인터 이므로 Inc나 Dec 같은 연산이 가능합니다. C처럼 종료 문자열은 NULL 입니다.
샘플 코드 입니다.
var
myString : AnsiString;
myCharPtr : PAnsiChar;
i : Integer;
begin
// Create a string of AnsiChar's
myString := 'Hello World';
// Point to the first character in the string
i := 1;
myCharPtr := Addr(myString[i]);
// Display all characters in the string
while i <= Length(myString) do
begin
ShowMessage(myCharPtr^);
Inc(i);
Inc(myCharPtr);
end;
end;
H
e
l
l
o
W
o
r
l
d
e
l
l
o
W
o
r
l
d
PAnsiString
type PAnsiString = ^AnsiString;
AnsiString 자체가 포인터이므로 PAnsiString은 잘 이용되지 않습니다.
PChar
type PChar = ^Char;
PChar는 Char 값의 포인터 입니다. 정수연산을 하듯이 Inc나 Dec등으로 포인터를 더하거나 뺄 수 있습니다.
var
myString : string;
myCharPtr : PChar;
i : Integer;
begin
// Create a string of Char's
myString := 'Hello World';
// Point to the first character in the string
i := 1;
myCharPtr := Addr(myString[i]);
// Display all characters in the string
while i <= Length(myString) do
begin
ShowMessage(myCharPtr^);
Inc(i);
Inc(myCharPtr);
end;
end;
H
e
l
l
o
W
o
r
l
d
e
l
l
o
W
o
r
l
d
PCurrency
type PCurrency = ^Currency;
var
currPtr : PCurrency;
begin
// Allocate storage for three currency variables
GetMem(currPtr, 3 * SizeOf(Currency));
// Fill out these currency variables
currPtr^ := 123.45;
Inc(currPtr);
currPtr^ := 2.9;
Inc(currPtr);
currPtr^ := 87654321;
// Now display these values
Dec(currPtr, 2);
ShowMessageFmt('Currency 1 = %m',[currPtr^]);
Inc(currPtr);
ShowMessageFmt('Currency 2 = %m',[currPtr^]);
Inc(currPtr);
ShowMessageFmt('Currency 3 = %m',[currPtr^]);
end;
Currency 1 = ?123.45
Currency 2 = ?2.90
Currency 3 = ?87,654,321.00
Currency 2 = ?2.90
Currency 3 = ?87,654,321.00
PDateTime
type PDateTime = ^TDateTime;
var
dateTimePtr : PDateTime;
a : TDateTime;
begin
// Allocate storage for three date time variables
GetMem(dateTimePtr, 3 * SizeOf(Extended));
// Fill out these date time variables
dateTimePtr^ := Yesterday;
Inc(dateTimePtr);
dateTimePtr^ := Date;
Inc(dateTimePtr);
dateTimePtr^ := Tomorrow;
// Now display these values
Dec(dateTimePtr, 2);
ShowMessage('Yesterday = '+DateToStr(dateTimePtr^));
Inc(dateTimePtr);
ShowMessage('Today = '+DateToStr(dateTimePtr^));
Inc(dateTimePtr);
ShowMessage('Tomorrow = '+DateToStr(dateTimePtr^));
end;
Typical program output:
Yesterday = 10/04/2003
Today = 11/04/2003
Tomorrow = 12/04/2003
Yesterday = 10/04/2003
Today = 11/04/2003
Tomorrow = 12/04/2003
PExtended
type PExtended = ^Extended;
var
extPtr : PExtended;
begin
// Allocate storage for three extended variables
GetMem(extPtr, 3 * SizeOf(Extended));
// Fill out these extended variables
extPtr^ := 123.45;
Inc(extPtr);
extPtr^ := 2.9;
Inc(extPtr);
extPtr^ := 87654321;
// Now display these values
Dec(extPtr, 2);
ShowMessageFmt('Value 1 = %f',[extPtr^]);
Inc(extPtr);
ShowMessageFmt('Value 2 = %f',[extPtr^]);
Inc(extPtr);
ShowMessageFmt('Value 3 = %f',[extPtr^]);
end;
Value 1 = 123.45
Value 2 = 2.90
Value 3 = 87654321.00
Value 2 = 2.90
Value 3 = 87654321.00
PInt64
type PInt64 = ^Int64;
var
int64Ptr : PInt64;
a : TDateTime;
begin
// Allocate storage for three Int64 variables
GetMem(int64Ptr, 3 * SizeOf(Int64));
// Fill out these Int64 variables
int64Ptr^ := 1;
Inc(int64Ptr);
int64Ptr^ := 22;
Inc(int64Ptr);
int64Ptr^ := 333;
// Now display these values
Dec(int64Ptr, 2);
ShowMessageFmt('Value 1 = %d',[int64Ptr^]);
Inc(int64Ptr);
ShowMessageFmt('Value 2 = %d',[int64Ptr^]);
Inc(int64Ptr);
ShowMessageFmt('Value 3 = %d',[int64Ptr^]);
end;
Value 1 = 1
Value 2 = 22
Value 3 = 333
Value 2 = 22
Value 3 = 333
Pointer
type Pointer;
포인터 변수 유형은 모든 메모리를 기반으로 일반적인 사용에 대한 포인터를 제공합니다. 즉 어떤 데이터 타입이든 넣을 수 있습니다. 예로 객체, 스트링, 배열등 어떠한 형이라도 참조가 가능합니다. 하지만 주의 할 것은 형식화되지 않은 포인터의 사용은 많은 문제를 유발할 수 있습니다. 되도록이면 형식에 맞는 포인터 유형을 사용 하는 것이 좋습니다.
var generalPtr : Pointer; // A pointer to anything formPtr : ^TForm; // A pointer to a form object begin // The current unit's form is addressable via the self keyword generalPtr := Addr(self); // We can assign this pointer to the form pointer formPtr := generalPtr; // And set the form caption to show this formPtr.Caption := 'Test program'; end;
The form is shown with caption:
Test program
Test program
PShortString
type PShortString = ^ShortString;
var myString : shortString; stringPtr : PShortString; begin // Set up our short string myString := 'Hello World'; // Point to our string stringPtr := Addr(myString); // Display the string using the pointer ShowMessage(stringPtr^); end;
Hello World
PString
type PString = ^String;
String 자체가 포인터이므로 잘 사용되지 않습니다.
PVariant
type PVariant = ^Variant;
PWideChar
PWideChar = ^WideChar;
var
myWideString : WideString;
myWideCharPtr : PWideChar;
i : Integer;
begin
// Create a string of WideChar's
myWideString := 'Hello';
// Point to the first character in the string
myWideCharPtr := Addr(myWideString[1]);
// Display the string
ShowMessage(myWideCharPtr);
// Now increment the pointer
Inc(myWideCharPtr,2);
// And see what is shows now
ShowMessage(myWideCharPtr);
// Display all characters in the string
while i <= Length(myWideString) do
begin
ShowMessage(myWideCharPtr^);
Inc(i);
Inc(myWIdeCharPtr);
end;
end;
Hello
llo
llo
PWideString
type PWideString = ^WideString;
댓글 없음:
댓글 쓰기