[C++] Pointer

Connected Brain·2025년 10월 21일

Pointer

개념

  • 변수를 선언하면 해당 변수는 메모리 주소를 할당받고 해당 메모리 주소에 할당된 공간에 저장
  • 특정 변수에 대해서 메모리 주소를 통해 해당 값을 가리키도록하는 변수의 타입이 Pointer
  • 클래스에서 해당 객체의 내부에 있는 요소를 접근할 때 (객체 변수명).(접근 대상) 의 형태를 사용하지만 포인터로 지시하고 있는 경우 (포인터)->(접근 대상)으로 사용

사용

int a = 10;
int* p;
p = &a
  • 변수의 타입과 함께 *를 통해 해당 변수가 pointer임을 표시
  • 메모리 시작 지점과 포인터에 저장하고자 하는 변수의 타입을 알면 변수에게 할당된 메모리 공간의 크기를 알 수 있으므로 해당 포인터가 지칭하는 값을 조작할 수 있음
  • &문자는 해당 변수의 메모리 주소를 확인할 때 사용
  • 포인터 앞에 *를 붙혀 출력하면 해당 포인터의 역참조를 가져옴. 해당 코드에서의 경우라면 a의 값인 10이 출력됨

주의할 점

  • 사용 전 반드시 초기화 작업이 필요함
  • 생성된 후에는 무작위 값을 가지고 있기때문에 사용할 변수의 주소를 할당하는 설정을 거쳐야 오류를 방지할 수 있음

종류

  • 상태와 기능에 따라 pointer를 4개로 크게 구분할 수 있음

Null Pointer

  • 특정한 메모리 주소를 가리키고 있지 않은 포인터
  • 앞서 언급한 초기화가 이루어지지 않은 상태

Void Pointer

  • 여러 데이터 타입에 사용되는 일반적인 포인터
void*  p;
pi = (int*)p
  • void 타입으로 선언된 포인터는 여러 타입으로 캐스팅 할 수 있으며, 반대로 특정 타입의 포인터를 void* 타입으로 전환하는 것도 가능
  • 캐스팅을 통해 해당 메모리에 있는 내용의 해석이 달라지므로 주의가 필요

Dangling Pointer

  • 이미 해제된 메모리 주소를 가리키고 있는 포인터
  • 동적 메모리 할당을 통해 만들어진 메모리 공간을 지시하다 해당 공간이 해제된 이후에도 포인터가 해제되지 않을 경우 해당 포인터가 "Dangling Pointer"상태라고 지창

Function Pointer

  • 함수의 메모리 주소를 가리키고 있는 포인터
    (Like delecate in C#)

이중 포인터

int i = 10;
//p에 i가 저장된 메모리 주소 저장
int* p = &i;
//pp에 p가 저장된 메모리 주소 저장
int** pp = &p;
  • 이중 포인터란 포인터가 저장된 메모리 공간을 지시하는 포인터

    	*p = **pp = 10
    	*pp = p = &i

배열 포인터

    int arr[5] = {10, 20, 30, 40, 50};
    int *p = &arr[1];

    cout << *++p << endl;
    p--;
    cout << *--p << endl;
  • 배열의 경우 +-를 활용해 특수한 연산이 가능함
  • 포인터에 대해 +1또는 -1연산을 실시하면 해당 배열에서 주어진 타입의 크기만큼 1칸 뒤 또는 1칸 앞에 있는 값을 표시
  • 해당 주소를 기준으로 타입의 크기만큼의 간격으로 배열이 값을 저장하므로 위와 같은 접근이 가능

0개의 댓글