반응형

델파이 포인터 형식 간단 설명(기록용)

 

*포인터 개념을 쉽게 이해하기 위해선 컴퓨터 메모리 개념을 먼저 숙지하시면 좋습니다.

그리고 아래는 설명하기위한 글이기 보단 기록용으로 작성함것임을 참고하세요.


 

참고로 p1 은 포인터형, a는 integer 형 변수입니다.

var

 p1:pointer;

 a:integer;

 

begin

 

p1:=@a;      //a 변수 자체의  주소를 기억

                 //a 변수도 메모리에 할당 되어 있으므로, 메모리에 할당된 하나의 저장 공간 입니다.

 

p1:=ptr(a);   //a 변수에 입력된  값을 주소로 기억

                //만일 a 변수 값이 123 이라면, 이값을 주소값으로 사용합니다.

                //a 에 특정 메모리의 주소 값이 들어 있을때 사용

 


 

p1^    //p1 에 기록되어 있는 주소 값을 참조해서 입출력,

 

var

p1:^integer;  //integer 형 포인터 (같은 형식임 = p1:Pinteger; )

 

a,

b:integer

 

begin

 

p1:=@a;      //p1 포인터에 a 변수 주소를 입력

 

p1^:=123;  //입력 a=123 과 같음

b:=p1^;     //출력 b=a 와 같음

 


a:=integer(@b); // a에 b 주소값을 받음 (a,b = integer)

a:=integer(p1); // a에 p1포인터 주소값을 받음

 

inc(p1);    //p1에 설정된 포인터형에 따라 주소를 증가

 

               //byte 형이면 1 바이트 주소 증가,

               //word(2 바이트), integer(4바이트) 이면 그 크기에 맞추어 증가

 

               //구조체 형 등은 구조체 크기에 맞게 주소가 증가합니다.

 

inc(p1,3);  //식으로 주소 위치가 3배 증가되는 식으로도 사용 가능합니다.

 

inc(p1^);  //식은 p1의 주소 값 번지 안에 있는 데이터 값을 1 증가하라는 뜻으로,

              위와 헛갈릴 수 있으니 주의해야 합니다.

 

inc(p1^,4); 라면 p1의 주소 값 번지 안에 있는 데이터 값을  4 증

 


integer 형 포인터에서,1byte 뒤 위치를 주소로 지정하기

 

ex)

var

a:integer;

 

p1:Pinteger; //여기서      :Pinteger =  :^integer 과 뜻이 같음

 

pp:pointer;  //어떤 형태로든 호환되는, 포인터 하나 더 설정

 

begin

 

  p1:=@a;          //p1에 a 변수의 주소를 받음

 

  pp:=pchar(p1)+1;   //pp는 a 주소의 + 1 byte 위치를 가르킴

 

 

  //만일 p1(pinteger)에 위식을 대입하기 위해선 아래와 같이 함, 

  p1:=pointer(pchar(p1)+1);   //+1 값을 조절 될수 있음

 

  p1:=pp;   //방식으로도 가능함


함수 호출시

 

//포인터 주소 에서, 한 바이트 뒤(+1 byte)를 어드레스로 지정하고 싶을떄

 

d3d.TxtOutP(0,0,pchar(pdata)+1);          //pdata 에서 + 1 바이트 뒤 주소를 지정해서  d3d.TxtOutP 함수를 호출한다

 

 

ex)procedure TmyD3d.TxtOutP(zx, zy: integer; zp: pointer);

 


다른 타입의 포인터 끼리 주소 받기

포인터 타입이 다를때 주소 받기 입니다.

var

P1b : ^byte;           //  byte 형 포인터

P1i : ^integer;         //  integer 형 포인터 

 

a:integer;

 

begin

 

P1b:=@a;                   //a  변수 주소를 byte 형 포인터에 받음

 

p1i:=pointer(P1b);        //byte형 포인터 주소를 integer 형 포인터 주소로 받음

 

 

다른 타입의 포인터를 함수에서 받기

ex)

var

  p1b:^byte;

 

begin

  testx(p1b);  //함수호출

 

 

procedure testx(zp1:pointer);

var

  ap2:^TFloatRec;

begin

  ap2:=zp1;                //TFloatRec 구조체의 시작위치 포인터를 zp1 포인터로 설정함

 


//포인터 기준에서 +,-  어드레스 위치 조절하여 값 대입하기

var

 

p1:^integer; 

 

begin

ex)

      Pinteger(uint(p1)+8)^:=123;   // p1에서 + 8 byte = 위치에 123 값(integer) 을 입력 

 


델파이에서 포인터를 array 형으로 변형 사용하기

var

  ap:Pinteger

  dp:array of integer;

 

begin

 

 pointer(dp):=ap;      //ap 는 이미 버퍼가 할당된 포인터일 경우 입니다.

 dp[0]:=1;                //  <------  같음 -------> ap^:=1;

반응형

+ Recent posts