(참고: stackoverflow.com/questions/1461432/what-is-array-to-pointer-decay)

C, C++에서 배열과 포인터는 같다고 알고 계시는 분이 많을건데 뭐 거의 맞습니다만 정확하게는 약간 다릅니다

  • 배열: 사이즈 정보 있음 (sizeof로 찍어보면 element 수를 알 수 있다)
  • 포인터: 사이즈 정보 없음

여기서 배열->포인터 전환하면서 사이즈 정보를 버리는 건 가능합니다. 이걸 decay라고 합니다. 배열에서 포인터로 implicit conversion을 말합니다.

그럼, 포인터->배열은 될까요? 안됩니다. 사이즈 정보가 없기 때문입니다.

const int a[] = { 2, 3, 5, 7, 11 };
const int* p = a;	// array to pointer decay
assert( sizeof(p) != sizeof(a) );  // sizes are not equal

 

C++11부터 std::decay가 추가됐습니다 (en.cppreference.com/w/cpp/types/decay)

Applies lvalue-to-rvalue, array-to-pointer, and function-to-pointer implicit conversions to the type 
T, removes cv-qualifiers, and defines the resulting type as the member typedef type.

이걸로 타입의 decay 여부를 확인할 수도 있겠네요

반응형