본문 바로가기
Delphi/문법

델파이 포인터 (Pointer) 9편

by MonoSoft 2023. 8. 22.
728x90
반응형

델파이 포인터 (Pointer) 9편

 

 

 

 

 

 

포인터의 이해 1

 

포인터를 쉽게 이해하기 위해선

어셈블러를 알고 있다면 금방알수 있습니다.

 

그렇지 않다면 메모리에 대한 계념 자체를

이해하고 있다고 해도 금방 알수가 있죠.

 

그러지 않다면 배열 에 대한 이해를 알고 있다면 도움이 됩니다.

 

메모리로 설명 하자면 (윈도우는 32 비트메모리를 쓰므로 32 트로 갑니당)

 

00000000 <----- 처음 메모리가 시작하는 번지

00000001

00000002

.

.

. <- 이 안에 프로그램에서 배열을 선언하면

. 데이터등이 랭귀지방식에 따라서 자동 들어가게 된다

10000023 <- 만일 이 안에 1 바이트 A 가 있다.

. 무슨수로 써서든 이 데이터를 읽거나 쓰거나

. 조작해야겠다

. 그래 여기에다 B 를 넣자

. 그럼 어셈블러로는 (당근 윈도우 메모리에 락때문에 아래 메모리로 지정해서 실행 하면 안됩니다)

mov eax,10000023 어드레스 지정 이걸 파스칼에서

포인터 설정이라 합니다

mov [eax],byte ptr B 아싸 B 를 넣다

결론은 버퍼의 특정한 메모리 부분을 조작하기위해서 지정하는 것입니다.

 

특정한 점을 지정한다고해서 (점=Point) (점 지정하는넘 = Pointer) 라고 이름 지어졌죠.

 

 

 

 

포인터의 이해 2

 

목욕탕과 포인터를 비교해 보겠습니다.

 

1. 목욕탕에는 번호표가 붙은 여러개의 옷장이 있고 여기에는

옷이나 기타 물건이 보관되어 있습니다.

각각의 메모리 번지(목욕탕에 붙은 번호표에 해당하는 옷장)에는

데이터(옷이나 기타물건)가 저장되어있습니다.

 

2. 옷장에는 해당 옷장을 열수있는 열쇠가 있습니다.

이 열쇠에도 번호표가 붙어있죠.

여기서 열쇠는 포인터 변수에 해당하고 열쇠에 붙어있는

번호표는 실제 포인터 변수에 들어있는 값에 해당합니다.

메모리의 특정번지(특정 옷장)에 접근하기 위해서는

접근할 메모리 주소를 알고있어야하는데 포인터

변수에는 해당 메모리의 주소가 들어있습니다.

옷장 열쇠에도 보면 번호표가 붙어있는데

이게 실제 포인터 변수에 들어있는 값이라고 생각하면 됩니다.

 

3. 델파이에서 포인터변수에 들어있는 번지의 데이터를 가지고 오기 위해서

 

다음과 같은 방법을 사용합니다.

 

var

  P: PChar; (^Char -> 이건 열쇠를 만드는 겂니다. 하지만 아직 번호표가 붙어있지 않죠)

  P2: Byte absolute 11000; (이건 열쇠를 만들고 바로 11000 이라는 번호표를 붙어주라는 얘기입니다)

  P3: PChar;

  C: Char;

begin

P := PChar(10000);

{요건 실제 열쇠에다가 번호표를 붙여주는 겁니다. 이미 옷장이 있을때 입니다.

이건 곧 포인터 변수 P가 이미 할당된 특정 메모리를 접근하기 위해서

포인터 변수에 주소를 지정하는 겁니다}

 

P3 := AllocMem(20000);

{ 요건 새로 20000 크기의 옷장을 하나 만들고

해당 옷장의 번호를 열쇠의 번호표에 기록하라는 겁니다.

즉 20000 사이즈의 메모리를 할당하고 할당된 메모리 주소를

포인터 변수 P3 에 대입하라는 얘기입니다}

 

C := P^;

{ 요기서 P^ 라고 포인터 변수뒤에 ^ 를 붙이는 것은

해당열쇠에 붙어있는 번호표(포인터변수에 들어있는 값)에 해당 하는

옷장(메모리 번지)에 들어있는 물건(데이터)를 꺼내오라는 얘기겠지요?}

 

P^ := 'A';

{ 요건 포인터 변수에 들어있는 메모리번지에 'A' 라는 값을 집어넣으라는 얘기인데

열쇠에 붙은 번호표에 해당하는 옷장안에 내용물을 집어넣으로난 얘기겠죠? }

 

FreeMem( P3 );

{ 요건 포인터 변수에 들어있는 주소의

메모리 공간을 해제하라는 얘기입니다.

옷장 치워버리라는(폐기처분) 얘기죠}

 

C := P3^;

{ 요건 에러입니다. 위에서 옷장을 페기처분 했기때문에

해당 열쇠에 붙어 있는 번호표에 해당하는 옷장이없잖아요?

당연히 안될얘기죠}

 

P3 := nil;

{ 요건 포인터 변수가 더이상 특정 메모리를

가르키지 않도록 하라는 겂니다.

즉 열쇠의 꼬리표를 떼어내버리라는 얘기죠

왜 이렇게 하냐하면 잘못된 열쇠 사용을 미연에 방지하기 위해서죠

열쇠에 번호표가 없으니 위의 경우와 같이 실수할 일이 없잖아요?}

 

end;

 

이중 포인터같은 것도 있는데 이건 열쇠를 보관하는

열쇠보관함의 열쇠 정도로 생각하시면 되겠네요

 

그럼 이만....

728x90
반응형

'Delphi > 문법' 카테고리의 다른 글

델파이 포인터 (Pointer) 11편  (0) 2023.08.24
델파이 포인터 (Pointer) 10편  (0) 2023.08.23
델파이 포인터 (Pointer) 8편  (0) 2023.08.21
델파이 포인터 (Pointer) 7편  (0) 2023.08.11
델파이 포인터 (Pointer) 6편  (0) 2023.08.10

댓글