포인터 역참조(Dereferencing)의 의미
역참조(Dereferencing)란 포인터가 가리키고 있는 메모리 위치에 저장된 데이터에 접근하거나 조작하는 작업을 말합니다. C와 C++에서는 간접 참조 연산자인 *(애스터리스크)를 사용하여 수행합니다.
포인터 변수 앞에 *를 붙이면 해당 포인터가 가리키는 실제 변수에 접근하게 됩니다. 이처럼 포인터를 통해 원본 값에 도달하는 과정을 '포인터의 역참조'라고 부릅니다.
역참조 기본 예제
int main() {
int a = 7, b;
int *p; // 초기화되지 않은 포인터 선언
p = &a; // 변수 a의 주소를 p에 저장
b = *p; // p가 가리키는 주소의 값을 b에 대입
}코드 단계별 설명
1. 포인터 선언: int *p;는 정수형 변수의 주소를 저장할 수 있는 포인터 p를 선언합니다. 이 시점에는 아직 유효한 주소를 가지고 있지 않습니다.
2. 주소 할당: p = &a;에서 & 연산자(주소 연산자)를 사용해 변수 a의 메모리 주소를 구한 뒤 포인터 p에 저장합니다. 즉, p에 들어 있는 값은 곧 변수 a의 주소입니다.
3. 역참조로 값 읽기: b = *p;에서 * 연산자로 p를 역참조하면, p가 가리키는 주소(a의 주소)에 저장된 값 7을 꺼내어 변수 b에 대입합니다. 결과적으로 b는 7이 됩니다.
역참조 사용 시 주의사항
역참조는 강력하지만 잘못 사용하면 프로그램 오류로 이어질 수 있습니다.
- 초기화되지 않은 포인터: 유효하지 않은 임의의 주소를 가리키는 포인터를 역참조하면 정의되지 않은 동작(Undefined Behavior)이 발생할 수 있습니다.
- 널 포인터 역참조: NULL 또는 nullptr을 가리키는 포인터를 역참조하면 세그멘테이션 폴트(Segmentation Fault)로 프로그램이 비정상 종료될 수 있습니다.
- 해제된 메모리 접근: free()나 delete로 해제한 메모리를 가리키는 댕글링 포인터(dangling pointer)를 역참조하는 것도 위험합니다.
따라서 포인터를 역참조하기 전에는 반드시 유효한 주소를 가리키고 있는지 확인하는 습관이 중요합니다.