C++ 역참조
C++ 역참조
C++ 역참조(Dereferencing)
📌 1. 역참조(Dereferencing)란?
역참조(Dereferencing)란 포인터가 가리키는 메모리 주소에 접근하여 해당 값을 가져오거나 수정하는 과정을 의미합니다.
즉, 포인터(*)를 사용하여 포인터가 가리키는 실제 변수의 값에 접근하는 것입니다.
✅ 2. 역참조 연산자(*)
🔹 역참조 기본 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
int main() {
int x = 10;
int* ptr = &x; // x의 주소를 저장
std::cout << "x의 값: " << *ptr << std::endl; // ✅ 역참조하여 x의 값(10) 출력
*ptr = 20; // ✅ 역참조를 사용하여 x의 값을 변경
std::cout << "변경된 x의 값: " << x << std::endl; // 20
return 0;
}
📌 포인터 ptr을 역참조(*ptr)하면, 포인터가 가리키는 변수 x의 값을 가져오거나 변경할 수 있음.
✅ 3. 역참조의 동작 방식
- 포인터에는 변수의 메모리 주소가 저장됨.
- 역참조 연산(
*ptr)을 수행하면 해당 주소에 저장된 값을 가져옴. - 역참조 연산을 통해 값을 변경할 수도 있음.
| 코드 | 동작 |
|---|---|
int* ptr = &x; | ptr에 x의 주소를 저장 |
*ptr; | ptr이 가리키는 주소에서 값을 가져옴 |
*ptr = 20; | ptr이 가리키는 주소의 값을 20으로 변경 |
✅ 4. nullptr을 역참조하면 오류 발생
포인터가 유효한 주소를 가리키지 않는 상태(nullptr)일 때 역참조를 하면 런타임 오류(Segmentation Fault, Access Violation)가 발생합니다.
🔹 잘못된 예제
1
2
int* ptr = nullptr;
std::cout << *ptr; // ❌ 오류! (잘못된 메모리 접근)
📌 포인터가 nullptr인 상태에서 역참조하면, 존재하지 않는 메모리 주소에 접근하려 하므로 프로그램이 충돌함.
✅ 안전한 코드
1
2
3
4
5
if (ptr) {
std::cout << *ptr;
} else {
std::cout << "포인터가 nullptr입니다.";
}
📌 역참조 전에 항상 포인터가 유효한지(nullptr 체크)를 확인하는 것이 안전함.
✅ 5. 다중 포인터의 역참조 (**)
C++에서는 이중 포인터(int**) 이상의 다중 포인터도 역참조할 수 있음.
1
2
3
4
5
int x = 10;
int* ptr = &x;
int** dptr = &ptr; // 이중 포인터
std::cout << **dptr << std::endl; // ✅ x의 값(10) 출력
📌 **dptr을 사용하면, ptr이 가리키는 변수 x의 값을 가져올 수 있음.
✅ 6. 참조와 포인터의 역참조 차이
🔹 참조는 기본적으로 역참조된 변수처럼 동작
1
2
3
4
int x = 10;
int& ref = x; // ref는 x를 참조
std::cout << ref; // ✅ 자동 역참조
📌 참조(&)는 자동으로 역참조되므로 * 연산자가 필요하지 않음.
| 구분 | 사용법 | 설명 |
|---|---|---|
| 포인터 | *ptr | 포인터를 통해 원본 변수 접근 |
| 참조 | ref | 참조는 자동으로 역참조됨 |
✅ 7. 결론
✔ 역참조(*ptr)는 포인터가 가리키는 변수의 값을 가져오거나 수정하는 연산.
✔ 포인터를 역참조하면 해당 주소의 실제 데이터를 읽거나 변경 가능.
✔ 포인터가 nullptr이면 역참조하면 안 되며, 항상 nullptr 체크가 필요함.
✔ 이중 포인터(**ptr)를 사용하면 다중 레벨의 변수를 조작 가능.
✔ 참조(&)는 자동으로 역참조되므로 * 연산이 필요 없음.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.