본문 바로가기
C++

6-3. 포인터와 정적 배열

by kwon5346 2024. 2. 18.
반응형

포인터와 정적 배열의 관계

포인터와 정적 배열의 관계를 이해하는 것은 이후 메모리 동적할당, 동적배열 등을 이해할 때
중요한 기본이 된다. 배열은 포인터로 다 접근할 수 있고 포인터와 배열은 같다.

#include <iostream>

using namespace std;

int main()
{
    int arr[5] = { 4, 3, 1, 5, 6 };

    cout << arr[0] << endl;     // 4
    cout << arr << endl;        // 0x16fa7b1f0
    cout << &arr[0] << endl;    // 0x16fa7b1f0
    cout << *arr << endl;       // 4

    return 0;
}

배열이 함수의 parameter로 들어오는 경우 주의해야 할 경우가 있다.

#include <iostream>

using namespace std;

// void printArray(int * array) 
void printArray(int array[])
{
    cout << sizeof(array) << endl;
    cout << *array << endl;

    *array = 100; 
}
int main()
{
    int arr[5] = { 4, 3, 1, 5, 6 };

    cout << arr[0] << endl;     // 4
    cout << arr << endl;        // 0x16fa7b1f0
    cout << &arr[0] << endl;    // 0x16fa7b1f0
    cout << *arr << endl;       // 4

    cout << sizeof(arr) << endl; // 20
    printArray(arr);             // 8

    cout << *arr << endl;        // 100

    return 0;
}

sizeof(arr)를 main에서 찍어봤을땐 20이 나오는데, printArray 함수 내부에서 출력했을땐 8이 나왔다.
굳이 포인터를 parameter로 쓰지않고 array로 보냈는데, array처럼 보이지만 내부적으로 그냥 포인터라는 것이다.
또한 printArray 함수에서 de-referencing한 array를 100으로 바꾸면 함수 밖에서도 값을 변경할 수 있다는 것도 포인터의 중요한 성질이다.

문법상으로 정적 배열을 포인터와 똑같이 사용하기보다 좀더 편하게 정적 배열 답게 쓸수 있도록 도와주는 장치가 있다.

#include <iostream>

using namespace std;

struct Mystruct
{
    int array[5] = { 1, 2, 3, 4, 5 };
};

void printSize(Mystruct *ms)
{
    cout << sizeof((*ms).array) << endl;
}

int main()
{
    Mystruct ms;

    cout << sizeof(ms.array) << endl; // 20
    printSize(&ms);                   // 20    

    return 0;
}

결론은 함수의 파라미터로 정적 배열을 넣었을 경우에는 포인터로 강제 변환이 되어 배열로써 사용할수 없고,
배열이 구조체나 class 안에 들어있는 경우에는 포인터로 강제 변환이 되지 않는다.

반응형