포인터의 개념
포인터는 메모리 주소를 저장하는 변수입니다.
이를 통해 간접적으로 데이터에 접근하고 조작할 수 있습니다. 포인터는 동적 메모리 할당,
효율적인 데이터 구조 구현, 함수에 인자 전달 등 다양한 상황에서 중요한 역할을 합니다.
포인터 선언과 초기화
포인터는 다음과 같이 선언합니다.
주소 연산자 &
와 역참조 연산자 *
- 주소 연산자
&
: 변수의 메모리 주소를 얻습니다.
- 역참조 연산자
*
: 포인터가 가리키는 메모리 위치의 값에 접근합니다.
포인터와 배열
배열 이름은 첫 번째 요소의 주소를 나타냅니다.
포인터 연산
포인터에 정수를 더하거나 빼면 해당 타입의 크기만큼 주소가 변경됩니다.
널 포인터
널 포인터는 유효하지 않은 메모리 주소를 나타냅니다.
void 포인터
void 포인터는 모든 타입의 포인터로 변환될 수 있는 일반적인 포인터 타입입니다.
const와 포인터
const와 포인터의 조합은 다음과 같습니다.
포인터의 위험성
- 댕글링 포인터 : 해제된 메모리를 가리키는 포인터
- 메모리 누수 : 할당된 메모리를 해제하지 않음
- 버퍼 오버플로우 : 배열의 범위를 벗어난 접근
예방 방법
- 포인터 사용 후 nullptr로 설정
- 스마트 포인터 사용
- 배열 접근 시 범위 검사
스마트 포인터 소개 (C++ 11 이후)
C++ 11부터 도입된 스마트 포인터는 메모리 관리를 자동화합니다.
std::unique_ptr
: 단일 소유권 포인터
std::shared_ptr
: 공유 소유권 포인터
std::weak_ptr
: std::shared_ptr
의 순환 참조 문제 해결
간단한 예
연습 문제
- 정수형 포인터를 사용하여 두 변수의 값을 교환하는 함수를 작성하세요.
- 문자열(C-style string)의 길이를 계산하는 함수를 포인터를 사용하여 구현하세요.
- 정수 배열을 가리키는 포인터를 인자로 받아, 배열의 모든 요소를 출력하는 함수를 작성하세요.
- void 포인터를 사용하여 어떤 타입의 변수든 그 값을 출력할 수 있는 범용 출력 함수를 구현하세요.
참고자료
- C++ 공식 문서의 포인터 섹션 : Pointer declarations
- "Effective C++" by Scott Meyers (항목 13 : 자원 관리에는 객체가 그만!)
- "C++ Primer" by Stanley B. Lippman, Josée Lajoie, and Barbara E. Moo (Chapter 2 : Variables and Basic Types)
- C++ Core Guidelines의 포인터 관련 규칙 : ES.42 : Keep pointers to members simple and direct
- "A Tour of C++" by Bjarne Stroustrup (Chapter 13 : Resource Management)