포인터
포인터(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
지금까지의 과정을 그림으로 나타내면 다음과 같다.
왜 포인터를 사용할까?
사실 굳이 포인터를 사용하지 않고도 변수를 그대로 사용해도 좋다. 그렇다면 왜 포인터를 사용할까?
- 빠르고 간결하다. 만약 사용해야할 데이터의 크기가 크다고 가정을 해봤을 때 이 데이터를 직접 움직이고 복사한다면 오랜 시간이 소요될 수 있다. 포인터를 이용해서 데이터를 직접 움직이지 않고 참조하는 형식으로 데이터의 사용이 가능하다.
- 메모리에 직접 접근 배열을 선언할 때 배열의 크기를 유동적으로 지정해주는 동적 할당을 배웠었는데 이때 사용한 게 포인터이다. 포인터로 메모리에 직접 접근해서 배열의 크기를 지정해 준 것이다.
이 외에도 포인터를 사용했을 때의 이점이 많기 때문에 포인터를 사용한다.
마치며
이번엔 많은 사람들이 프로그래밍을 포기하는 원인 중 하나인 포인터에 대해서 배워봤습니다.
포인터는 기본적으로 컴퓨터 메모리에 직접 운용하기 때문에 컴퓨터를 따로 배워보지 않았으면 어려운 개념입니다.
하지만 그만큼 중요하고 편리한 개념이기 때문에 꼭! 이해하고 넘어가야 하는 부분입니다.
'C++ 독학 > [C++ 독학] C++ 배우기' 카테고리의 다른 글
[C++ 독학] 클래스 <C++의 핵심> 07 (0) | 2022.07.22 |
---|---|
[C++ 독학] 구조체 <C++ 의 기초> 06 (2) | 2022.06.06 |
[C++ 독학] 배열 <C++기초> 04 (0) | 2022.03.31 |
[C++ 독학] 제어문 <C++기초> 03 (0) | 2022.03.17 |
[C++ 독학] 변수와 타입 <C++의 기초> 02 (0) | 2022.03.06 |
댓글