포인터 연산
C++ 컴파일러는 포인터 연산할 때 포인터에 선언된 타입을 이용한다.
포인터를 int로 선언하고 그 값을 1만큼 증가하면 포인터는 메모리에서 한 바이트가 아닌 int 크기만큼 이동한다.
이 연산은 주로 배열을 다루는 데 유용하다.
배열에 담긴 데이터는 모두 타입이 같을 뿐만 아니라 메모리에 연속적으로 저장돼 있기 때문이다.
다음은 int 타입의 힙 배열을 선언한 경우이다.
int* myArray = new int[8];
이 배열의 인덱스 2에 해당하는 지점에 값을 넣는 방법은 이미 잘 알 것이다.
myArray[2] = 33;
위 코드를 포인터 연산으로도 표현할 수 있다.
다시 말해 myArray가 시작하는 시점에서 int 값이 담긴 칸을 두 번 건너서 거기 값을 역참조하면 된다.
*(myArray + 2) = 33;
포인터 연산의 강점은 myArray + 2와 같은 표현식으로 포인터를 표현하고,
이를 이용해서 더 작은 정수 배열을 표현할 수 있다.
다음과 같은 와이드 스트링에도 유용하게 쓸 수 있다.
const wchar_t* myString = L"Hello, World";
와이드 스트링을 인수로 받아서 그 값을 대문자로 변환해 새로운 스트링을 만들어 리턴하는 함수가 있다고 하자.
wchar_t* toCaps(const wchar_t* inString);
이 함수에 myString을 전달해서 대문자로 변환할 수 있다.
이때 myString의 일부분만 대문자로 변환하려면 원하는 부분의 시작점을 포인터 연산으로 표현한다.
예를 들면 World만 대문자로 바꾸기 위해 스트링의 시작점을 가리키는 포인터에 7을 더한 값을 함수로 전달한다.
toCaps(myString + 7)
포인터 연산에서 뺄셈도 유용하다.
한 포인터에서 같은 타입의 포인터를 빼면 두 포인터 사이에 몇 바이트가 있는지가 아니라
포인터에 지정한 타입의 원소가 몇 개 있는지 알 수 있다.
'💻프로그래밍 내용 정리 > C++17' 카테고리의 다른 글
[C++ 7.3.3] 가비지 컬렉션 (0) | 2022.08.24 |
---|---|
[C++ 7.3.2] 커스텀 메모리 관리 (0) | 2022.08.24 |
[C++ 7.2.2] 포인터와 배열2 (0) | 2022.08.24 |
[C++ 7.2.1] 배열과 포인터 (0) | 2022.08.24 |
[C++ 7.1.4] 포인터 다루기 (1) | 2022.08.22 |