포스트

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. 역참조의 동작 방식

  1. 포인터에는 변수의 메모리 주소가 저장됨.
  2. 역참조 연산(*ptr)을 수행하면 해당 주소에 저장된 값을 가져옴.
  3. 역참조 연산을 통해 값을 변경할 수도 있음.
코드동작
int* ptr = &x;ptrx의 주소를 저장
*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 라이센스를 따릅니다.