1. 포인터의 기본 정의
- 포인터는 일반적인 값(숫자, 문자 등)이 아닌 ‘메모리의 주소값’을 저장하는 변수
- 선언 방식: 데이터타입 변수이름; (예: int pNum;)
- 주소 연산자 (&): 변수의 메모리 시작 주소를 추출
- 역참조 연산자 (*): 포인터가 가리키는 주소로 가서 그곳에 저장된 실제 값을 가져오거나 수정
2. 정적할당 vs 동적할당
- 정적 할당은 stack / 동적 할당은 heap
- 정적 할당은 컴파일 중 / 동적 할당은 런타임 중
- 정적 할당은 { } 블록 벗어나면 자동으로 해제 / 동적 할당은 프로그래머가 직접 해제(delete)
3. 메모리 영역
- Stack: 매우 빠르고 관리가 자동
- 함수 호출시 생성되는 지역 변수들이 저장됨
- 크기가 제한적
- Heap:
- 사용자가 원하는 시점에 메모리를 할당하고 해제 할 수 있음
- 포인터를 통해서만 접근 가능
delete 를 하지 않으면 메모리 누수 발생
4. 포인터와 배열
- 포인터와 배열
studentNums 라는 배열이 있으면, studentNums 는 &studentNums[0] 과 같은 주소를 가짐
*(studentNums + 1) 은 studentNums[1] 과 동일한 의미
5. 다중 포인터
- 다중 포인터
- 주소값을 저장하는 변수(포인터)의 주소를 다시 저장하는 포인터
int** pB = &pA;
*pB 를 하면 pA 가 가진 주소값이 나오고, **pB 를 하면 pA 가 가리키는 실제 정수 값에 접근
6. 포인터가 필요한 이유
- 범위의 한계 극복: 함수 외부의 변수를 함수 내부에서 직접 수정하고 싶을 때 주소를 넘겨줌
- 효율적인 데이터 전달: 용량이 큰 구조체나 객체를 복사(Copy)하지 않고, 주소(8byte)만 전달하여 성능을 높임
- 유연한 메모리 관리: 실행 중에 필요한 만큼만 메모리를 할당받아 사용하기 위해서
7. 실제 프로젝트 적용 방안
- 코드 작성 할 때 메모리를 최대한 효율적이게 할당하고 아끼면서 게임의 성능 최적화를 할 때 사용하면 좋을 것 같습니다