본문 바로가기
C++ 독학/[C++ 독학] C++ 배우기

[C++ 독학] 포인터 <C++ 의 기초> 05

by NpsCause 2022. 4. 5.

포인터

포인터(pointer)는 변수나 자료의 주소 값을 저장하는 변수이다. 

 

일반적인 변수(int, char등) 는 정수, 문자와 같은 자료를 저장하는 것과 같이 포인터는 어떤 변수의 주소 값을 저장하는 변수라고 생각한다.

 

포인터는 다음과 같이 타입과 변수이름 사이에 '*' 아스트릭(asterisk mark)을 추가해 선언한다.

int *ptr;

 

포인터의 값으로는 변수의 주소를 넘겨주어야 하는데 변수의 주소는 '&' 앰 퍼센트(ampersand) 기호를 사용해서 접근한다.

int var = 10;
int *ptr = &var;  // 변수 var의 주소값 참조

int arr[5];
int *arrPtr = arr;  // 배열 arr의 첫번째 주소 참조

 

만약 포인터 변수를 출력하면 참조한 변수의 주소값이 나오게 되는데 참조한 변수의 값을 출력하고 싶으면 포인터 앞에 '*' 아스트릭을 붙여 값을 불러올 수 있다.

cout << ptr << endl;  // 주소값 출력

cout << *ptr << endl;  // 변수값 출력

 

마찬가지로 일반 변수에 '&' 엠퍼센트를 붙이면 주소 값을 가져올 수 있다.

cout << var << endl;  // 변수값 출력

cout << &var << endl;  // 주소값 출력

 

포인터로 배열을 참초한 경우엔 가장 첫번째 원소의 주소값을 참조하게 된다. 때문에 배열을 가리키는 포인터에 '*' 아스트릭 문자를 문이면 배열의 첫 번째 값을 가져오게 된다.

 

배열의 구조는 나열되어있기 때문에 다음과 같이 참조한 첫 번째 원소뒤에 1을 더해주면 두 번째 원소를 참조할 수 있다. 또 포인터는 배열과 같이 사용할 수 있다.

arr[5] = {1,2,3,4,5};

cout << *ptr+1 << endl;  // 2
cout << ptr[1] << endl;  // 2

 

 

지금까지의 과정을 그림으로 나타내면 다음과 같다.

변수 참조
배열 참조

 

왜 포인터를 사용할까? 

사실 굳이 포인터를 사용하지 않고도 변수를 그대로 사용해도 좋다. 그렇다면 왜 포인터를 사용할까?

  1. 빠르고 간결하다. 만약 사용해야할 데이터의 크기가 크다고 가정을 해봤을 때 이 데이터를 직접 움직이고 복사한다면 오랜 시간이 소요될 수 있다. 포인터를 이용해서 데이터를 직접 움직이지 않고 참조하는 형식으로 데이터의 사용이 가능하다.
  2. 메모리에 직접 접근 배열을 선언할 때 배열의 크기를 유동적으로 지정해주는 동적 할당을 배웠었는데 이때 사용한 게 포인터이다. 포인터로 메모리에 직접 접근해서 배열의 크기를 지정해 준 것이다.

이 외에도 포인터를 사용했을 때의 이점이 많기 때문에 포인터를 사용한다.

 

마치며

이번엔 많은 사람들이 프로그래밍을 포기하는 원인 중 하나인 포인터에 대해서 배워봤습니다. 

 

포인터는 기본적으로 컴퓨터 메모리에 직접 운용하기 때문에 컴퓨터를 따로 배워보지 않았으면 어려운 개념입니다.

하지만 그만큼 중요하고 편리한 개념이기 때문에 꼭! 이해하고 넘어가야 하는 부분입니다.

댓글