C++

[C++]포인터와 레퍼런스

programmer-faust 2025. 9. 2. 20:47
  • 순서
    1. 포인터란?
    2. 댕글링 포인터
    3. void 포인터
    4. 레퍼런스란?
    5. 포인터와 레퍼런스의 차이
  • 포인터란?
    1. 메모리 주소를 값으로 저장하는 변수를 포인터라고 함.
    2. int* a 형식으로 선언하는데 int* a = &b 라고 작성하면 a는 b의 주소를 가리키고 있는 형태이다.
    3. 포인터는 다른 주소로 재지정 가능하며 없음을 표현할 때 nullptr로 사용함.
    4. 포인터는 선택적 객체 참조를 표현할 때 유용함.
  • 댕글링 포인터
    1. 포인터가 여전히 해제되어 유효하지 않은 메모리 영역을 가리키고 있을 때 해당 포인터를 댕글링 포인터라고 한다.
    2. 댕글링 포인터의 문제
      • 메모리 접근 시 예측 불가능한 동작
      • 메모리 접근 불가 시 Segmentation fault 발생
      • 잠재적인 보안 위험
    3. 예방/대처법
      • 스마트 포인터 사용(RAII 원칙)
      • delete/free 이후 즉시 nullptr을 대입하며 nullptr 체크
      • 지역 변수 주소 반환 대신 값 반환이나 힙/전역 변수 활용
      • 컨테이너 재할당 시 포인터 갱신
      • 런타임 분석기 사용
  • void 포인터
    1. 어떤 타입의 데이터든 가리킬 수 없는 타입 없는 포인터이다.
    2. 하지만 타입이 정해진 포인터와 달리, 가리키는 대상의 타입 정보를 모르기 때문에 직접 역참조 하는게 불가함.
    3. 특징
      • 범용 포인터로 어떤 자료형의 주소든 저장 가능함
      • 자료형의 크기가 정의되지 않아 포인터 연산 불가능
      • 역참조가 불가능함.
  • 레퍼런스란?
    1. 레퍼런스는 이미 존재하는 객채에 대한 별칭으로 선언 시 반드시 초기화 해야하고, 한 번 바인딩되면 다른 객체로 바꿀 수 없음
    2. 문법적으로는 일반 변수처럼 사용되며, 내부적으로는 포인터처럼 구현될 수 있음.
    3. 레퍼런스는 null값을 가질 수 없음
  • 포인터와 레퍼런스의 차이
구분 포인터 레퍼런스
초기화 나중에 가능 반드시 선언과 동시에 초기화
Null 허용 가능 불가능
재할당 다른 대상 가리킬 수 있음 불가능
연산 주소 연산, 산술 가능 불가능
함수 인자 전 *, & 필요 그냥 변수처럼 사용

'C++' 카테고리의 다른 글

[C++] malloc/free와 new/delete  (0) 2025.09.03
[C++]동적할당과 깊은/얕은 복사  (0) 2025.09.03
[C++]클래스와 구조체  (2) 2025.09.01
[C++]C와 C++ 언어의 차이점  (1) 2025.09.01
[C++]전위/후위연산자  (0) 2025.08.06