본문 바로가기

스터디

메모리와 포인터

반응형

메모리와 포인터 — 배열의 포인터 변환 (Array Decay)

 

결론부터 말하면 int[]int 는 서로 다른 자료형이다. 하지만 배열을 포인터에 담아 쓸 수 있는데, 그 이유가 오늘의 핵심이다.


배열은 곧 "첫 번째 주소"

배열을 포인터로 받으려면 원칙적으로 같은 자료형으로 선언해야 한다. 그런데 배열 이름 자체가 "첫 번째 원소의 주소"를 반환하는 성질을 가지기 때문에, 아래처럼 포인터에 그대로 대입할 수 있다.

#include <iostream>
using namespace std;

int main()
{
    int arr[3] = {10, 20, 30};

    int *p = arr;   // arr → 첫 번째 원소(arr[0])의 주소로 변환됨

    cout << *p     << "\n";  // 10 (arr[0])
    cout << *(p+1) << "\n";  // 20 (arr[1])
    cout << arr[2] << "\n";  // 30

    return 0;
}

여기서 int *p = arr;가 성립하는 이유는, 배열 arr이 표현식에서 자동으로 "첫 번째 원소를 가리키는 포인터"로 변환되기 때문이다. 이 현상을 Array-to-Pointer Decay(배열-포인터 변환, 배열 붕괴)라고 부른다.(어레이 투 디케이) 


주의: 정적 배열만 가능하다

이 변환은 정적 배열(static array)에서만 일어난다.

  • 가능 : int arr[3] 같은 정적 배열 → 포인터로 자동 변환됨
  • 불가능 : vector 는 배열이 아니라 클래스 객체이므로 이런 변환이 일어나지 않는다.

vector의 내부 데이터 주소가 필요하다면 decay에 의존하지 말고 아래처럼 명시적으로 접근해야 한다.

vector<int> v = {10, 20, 30};

int *p = v.data();   // 내부 배열의 첫 주소를 명시적으로 얻는다
// 또는
int *p2 = &v[0];

핵심 정리

  • int[]int : 배열과 원소는 엄연히 다른 타입이다.
  • 배열 이름은 표현식에서 첫 원소의 주소로 자동 변환된다 → Array Decay.
  • 이 변환은 정적 배열만 해당된다. vector.data() 또는 &v[0]를 써야 한다.

'스터디' 카테고리의 다른 글

코딩테스트-누적합  (0) 2026.07.07
코딩테스트-중복제거  (0) 2026.07.05
*  (0) 2026.07.03
코딩테스트-조합  (0) 2026.07.02
코딩테스트-시간복잡도  (0) 2026.07.01