당니의 개발자 스토리

[필수개념] 메모리와 포인터(pointer) #4 array to pointer decay 본문

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트/0주차 : 강의소개와 C++의 기본

[필수개념] 메모리와 포인터(pointer) #4 array to pointer decay

clainy 2024. 2. 6. 13:06

array to pointer decay

배열의 이름은 주소값으로 쓸 수 있다.

다른 말로, array to pointer decay 라는 현상이다.

이러한 배열이 있다고 하자. 이 배열의 이름으로 포인터를 할당할 수 있다.

쉽게 말하면, 배열의 이름배열의 주소값(= 배열의 첫 번째 원소의 주소값)이 들어있다는 것이다.

int [] 와 int 는 당연히 다르다. int형 1차원 배열과 int형은 서로 다른 타입이다.

포인터를 선언할 때, 주소값이 가리키는 변수와 같은 타입으로 선언해야한다고 했었다.

그런데 그럼 int[] * c = a 라고 해야하는거 아닌가? 어떻게 int * 로 했는데 이게 가능할까?

바로 array to pointer decay 라는 현상이 일어났기 때문이다.

이런 식으로 포인터에다가 배열의 이름을 할당하면, 이 배열 a의 크기 정보decay(부식하다), 즉 사라진다. 그리고 사라짐과 동시에 이 a 배열의 첫 번째 원소의 주소가 바인딩(binding) 된다. a 배열의 첫 번째 원소는 int형이므로, int * 로 받을 수 있는 거다.

이러한 현상이 array to pointer decay 라는 현상이다.


바인딩(binding)


이렇게 해서 배열의 이름은 주소로 사용될 수 있구나. 왜?

Array To Pointer Decay가 일어나면서, 포인터에다가 a를 할당하면서 배열의 이름, a에다가 첫 번째 주소가 바인딩 되니까, 그 원소가 int 형이므로 int[] * 이 아닌, int *로 포인터 선언이 가능하다.


이제 코드를 보면서 설명하겠다.

5번째 줄을 보면, 이렇게 Arrayed Pointer Decay 가 됐을 때 이 배열의 첫 번째 주소가 a에 바인딩 된다고 했다. 그렇기 때문에 c는 뭐를 반환해야될까? 배열의 첫 번째 값의 "주소"를 반환해야 한다.

그리고 이렇게 c + 1 을 하면, 그 다음 주소 값을 반환하게 할 수 있다. c + 1 의 의미는 a[1]의 주소값이다.

참고로 이런 식으로 vectorArrayed Pointer Decay가 안된다.

이러한 정적 배열에서만 Arrayed Pointer Decay가 된다는 것을 알아두면 된다.