C++에서 배열과 포인터는 기술적으로 밀접하게 연관된 관계이다.
배열의 이름이 메모리 주소를 가리키는 포인터로 동작한다는 점을 바탕으로 메모리 구조를 분석했다.
배열의 이름에 숨겨진 비밀
우리가 흔히 쓰는 int arr[5];에서 arr이라는 이름은 배열의 첫 번째 요소(&arr[0])를 가리키는 포인터와 같다.
-
주소값의 일치:
arr과&arr[0]은 정확히 같은 주소값을 가진다.
배열의 이름 자체가 시작 주소를 나타내기 때문이다. -
포인터 연산:
arr[i]라는 표현은 내부적으로*(arr + i)로 처리된다.
즉, 시작 주소에서i만큼 떨어진 곳의 값을 가져오라는 명령이다. -
함수 전달: 배열을 함수 인자로 넘기면 배열 전체가 복사되는 것이 아니라, 시작 주소(포인터)만 전달된다.
함수 안에서는 배열의 크기를 알 수 없으므로 크기 정보를 별도로 넘겨주는 것이 필수적이다.
동적 배열과 포인터
런타임에 크기가 결정되는 배열이 필요할 때는 new[]를 사용한다.
이때 반환되는 값은 포인터이며, 이를 통해 가변적인 데이터를 관리할 수 있다.
사용이 끝난 후 delete[]로 자원을 해제해야 한다.
메모리 직접 제어
배열 인덱스 접근이 내부적으로 포인터 덧셈으로 처리된다는 점은 중요하다.
메모리 공간을 연속적으로 사용하는 배열의 효율성과 이를 가리키는 포인터의 유연함을 이해하면 C++의 성능상 강점을 파악할 수 있는 것 같다.