C++ 포인터

김태완·2025년 1월 23일

포인터

C++에서 포인터란 데이터가 저장된 메모리의 주소값을 말한다.
C++ 공부를 진행하던 중 클래스를 구현하는 과정에서 포인터 참조를 하는 부분이 이해가 잘 되지 않았기에 포인터의 개념을 다시 정리하기로 했다.

주소 연산자(&)와 역참조 연산자(*)

우선 포인터에 대해 알아보기 전에 주소 연산자와 역참조 연산자에 대해서 알아보자.

  • 주소 연산자 (&)

변수에 할당된 메모리의 주소를 확인할 수 있는 연산자이다.
예를 들어

위와 같은 코드가 있다고 가정을 하면, 1번 줄의 출력값은 X값인 5가, 2번 줄의 출력값은 X의 주소값이 표기가 되어야 한다.

직접 출력을 하면 다음과 같이 출력이 되는 모습이다.

  • 역참조 연산자

특정 주소에서 값에 접근을 할 수 있게 해주는 연산자이다.
위의 예시 코드에 역참조 연산자 한 줄을 추가 해 주겠다

이렇게 위와 같은 코드에 역참조 연산자를 추가하면, 1번 줄과 2번 줄은 동일하게 출력이 되고 3번 줄에는 주소값이 아닌 X의 값이 출력되게 된다.

직접 출력을 하면 1번 줄과 3번 줄의 출력값이 같은 모습이다.

그래서 포인터란 무엇인가

처음에 언급을 했지만 포인터란 값이 아닌 메모리의 주소를 저장하는 변수이다.
일반 변수처럼 선언할 수 있으며, 자료형과 변수 이름 사이에 (*) 기호를 붙이는 것으로 선언할 수 있다.

Ex)
int a; -> int형 변수
int* a; -> int형 포인터

여기서 주의할 점은 포인터를 한 번에 여러 개 선언하는 경우이다.
여러 개의 포인터를 한 번에 선언 할 경우에는 변수명 앞에 각각 (*) 기호를 붙여주어야 한다.

Ex)
int a, b; -> int형 포인터 a와 b
int* a, b; -> int형 포인터 a와 int형 변수 b

이제 선언한 포인터에 값을 할당하자.
포인터는 메모리의 주소만 저장하므로 포인터에는 일반적인 숫자를 할당할 수 없다.
따라서 포인터는 다른 변수의 주소를 저장하는 용도로 주로 쓰인다.

변수의 주소는 위에서 알아본 주소 연산자(&)를 통해 얻을 수 있다.

다음과 같이 주소 연산자를 통해 변수 a의 주소값을 ptr에 저장하고 포인터 ptr의 변수값을 출력하면 a의 주소값이 출력이 되는 모습이다.

  • 주의사항
  1. 포인터 변수의 자료형은 포인터 변수가 가리키는 변수의 자료형과 같아야 한다.
  2. 포인터 변수에 일반 변수(숫자)를 넣을 수 없다.

정리

  1. 주소 연산자(&)는 피연산자의 주소를 반환하지 않고, 피연산자의 주소가 들어있는 포인터를 반환한다.
  2. 포인터의 값을 알고싶다면 역참조 연산자(*)를 이용해 포인터가 가리키는 주소의 값을 알 수 있다.

위의 사항들에 의하면 다음과 같이 정리를 할 수 있다.

  1. ptr은 &a와 같다. (ptr = &a)
  2. ptr은 a와 같다. (ptr = a)
  3. 따라서 *ptr은 변수처럼 값을 할당알 수 있다.

위와 같이 *ptr의 값을 바꾸고 a의 값을 출력하면 변경된 숫자가 출력이 되는 모습이다.

마치며

포인터가 많이 햇갈리기도 하고 이해하기 어려운 부분도 많아서 정리하는 시간을 가져보았는데, 사실 아직도 어렵고 햇갈리는 것 같다. 그래도 제대로 알아보기 전보다 조금은 포인터에 대해 알 수 있었던 것 같다.

0개의 댓글