Adaid's Workroom
[세가] 팁:포인터와 메모리 본문
모든 변수는 거대한 배열인 메모리에 배치되어 첨자로 관리된다(memory[2]과 비슷한 식으로).
컴퓨터에서 메모리는 결국 char형 배열에 지나지 않는다.
변수와 배열, 구조체, 함수, 클래스 등은 모두 메모리 위에 놓여져 '몇 번 부터 몇 번까지는 어떤 변수'라는 표로 관리된다.
이 표를 임의로 만들어 주는 것이 컴파일러다.
포인터
이 메모리배열에서 첨자를 메모리 주소(memory address) 혹은 단순히 주소(address)라고 부른다.
그리고 이 첨자가 들어 있는 변수를 포인터(pointer)라고 부른다.
C++ 포인터에서 사용하는 * 연산자는 포인터 변수를 첨자로 하여 메모리 배열에 접근하는 것이다.
모든 변수는 단순히 메모리 char 배열 중 어딘가를 빌려서 자리잡고 있는 것에 지나지 않는다.
예를 들어 클래스는 private 변수로 향하는 접근을 막고 있지만
마침 그곳 주소 즉 첨자를 알고 있어서 그 장소로 접근하는 포인터를 만든다면 그 변수를 조작할 수 있다.
포인터와 배열
char a[3];
위의 문이 하는 일은 메모리 안에서 비어 있는 장소를 찾아내서 그 주소를 a변수에 넣는 것이다.
주소가 있는 변수를 포인터라고 하므로 배열변수는 포인터 이외 아무것도 아니다.
char* b;
배열과 포인터 사이에 차이는 포인터는 비어 있는 메모리를 찾아 첨자를 넣는 처리를 생략한다는 것 뿐이다.
그러므로 b에는 사용할 수 있는 첨자가 들어있지 않아서 나중에 어떤 값을 대입해야만 한다.
다시 말해 배열변수는 '처음부터 사용 가능한 첨자가 들어 있는 포인터'를 말한다.
0포인터
int* p = 0;
*p = 4; //쓰기 오류
int a = *p; //읽기 오류
따라서 위의 코드는 규칙을 위반해 프로그램이 멈춘다.
delete한 포인터에 0을 넣는 이유는 이런 성질을 디버그에 활용하려는 것이다.
delete해도 포인터에는 값이 남아있는데 그 값을 이용하면 메모리에 접근할 수 있다.
이를 방지하기 위해 포인터에 0을 넣는 것이다.
또한 이런 특별한 규칙이 있기 때문에 상황에 따라서 0은 정수로 해석되기도 하고 포인트로 해석되기도 한다.
이 성질은 0만이 가진 특성이다.
int* p = 0; //가능
int* p = 1; //불가
그러므로 위의 문은 가능하나 아래는 아니다.
이 사양 때문에 곤란한 상황이 생길 수 있다.
A(int) 정수를 받는 생성자와 다른 형의 포인터로 만드는 생성자 A(B*)가 있으면 곤란해진다.
이때 A(0)이라고 쓰면 어느 쪽인지 알 수 없어 생성자가 오류를 낸다.
함수라면 이름을 바꾸면 그만이지만 생성자는 그럴수 없기 때문에 어느 한쪽은 포기해야 한다.
포인터 형
new와 delete
배열과 new의 차이
'서적 공부 > 게임 프로그래밍의 정석' 카테고리의 다른 글
[세가] 팁:참조 (0) | 2017.12.22 |
---|---|
[세가] 팁:플래그 (0) | 2017.12.19 |
[세가] C++ 보충 (2) (0) | 2017.12.19 |
[세가] C++ 보충 (1) (0) | 2017.12.17 |