1. 포인터의 기본 정의

  • 포인터는 일반적인 값(숫자, 문자 등)이 아닌 ‘메모리의 주소값’을 저장하는 변수
  • 선언 방식: 데이터타입 변수이름; (예: int pNum;)
  • 주소 연산자 (&): 변수의 메모리 시작 주소를 추출
  • 역참조 연산자 (*): 포인터가 가리키는 주소로 가서 그곳에 저장된 실제 값을 가져오거나 수정

2. 정적할당 vs 동적할당

  • 정적 할당은 stack / 동적 할당은 heap
  • 정적 할당은 컴파일 중 / 동적 할당은 런타임 중
  • 정적 할당은 { } 블록 벗어나면 자동으로 해제 / 동적 할당은 프로그래머가 직접 해제(delete)

3. 메모리 영역

  • Stack: 매우 빠르고 관리가 자동
    • 함수 호출시 생성되는 지역 변수들이 저장됨
    • 크기가 제한적
  • Heap:
    • 사용자가 원하는 시점에 메모리를 할당하고 해제 할 수 있음
    • 포인터를 통해서만 접근 가능
    • delete 를 하지 않으면 메모리 누수 발생

4. 포인터와 배열

  1. 포인터와 배열
    • studentNums 라는 배열이 있으면, studentNums&studentNums[0] 과 같은 주소를 가짐
    • *(studentNums + 1)studentNums[1] 과 동일한 의미

5. 다중 포인터

  • 다중 포인터
    • 주소값을 저장하는 변수(포인터)의 주소를 다시 저장하는 포인터
      • int** pB = &pA;
      • *pB 를 하면 pA 가 가진 주소값이 나오고, **pB 를 하면 pA 가 가리키는 실제 정수 값에 접근

6. 포인터가 필요한 이유

  • 범위의 한계 극복: 함수 외부의 변수를 함수 내부에서 직접 수정하고 싶을 때 주소를 넘겨줌
  • 효율적인 데이터 전달: 용량이 큰 구조체나 객체를 복사(Copy)하지 않고, 주소(8byte)만 전달하여 성능을 높임
  • 유연한 메모리 관리: 실행 중에 필요한 만큼만 메모리를 할당받아 사용하기 위해서

7. 실제 프로젝트 적용 방안

  • 코드 작성 할 때 메모리를 최대한 효율적이게 할당하고 아끼면서 게임의 성능 최적화를 할 때 사용하면 좋을 것 같습니다

0개의 댓글