1. 포인터 vs 배열

(1) 포인터

int* p;

- 주소를 담는 바구니

- 실제 값은 메모리의 어딘가에 있음

- p는 그 곳을 가리키는 포탈이라 할 수 있다

 

(2) 배열

int arr[10];

- 실제 원조 데이터를 가지고 있음

- 많은 데이터를 하나로 묶은 것

- '배열의 이름'은 배열의 '시작 주소값'을 가리킴 (TYPE* 포인터로 변환 가능함)

-> TYPE형 1차원 배열과 TYPE*형 포인터는 서로 완전 호환 됨 (서로 문법이 호환 됨)

 

2. 배열에 대한 포인터(?)

int main()
{
    int arr2[2][2] = {{1 ,2}, {3 ,4}};
    // 주소 2[      ]
    // 주소 1[ 주소 2]
    // pp[ 주소 1 ]
    int** pp = (int**)arr2;

    cout << (**pp) << endl;

    return 0;
}

단, 2차원 배열과 다중 포인터는 서로 호환이 되지 않는다.

위와 같은 경우에는 다중 포인터를 사용할 필요가 없다.

int main()
{
    int arr2[2][2] = {{1 ,2}, {3 ,4}};
    // 주소 2[      ]
    // 주소 1[ 주소 2]
    // pp[ 주소 1 ]

    int(*p2)[2] = arr2; // 배열
    cout << (*p2)[0] << endl;
    cout << (*p2)[1] << endl;
    cout << (*(p2 + 1))[0] << endl;
    cout << (*(p2 + 1))[1] << endl;

    cout << (p2)[0][0] << endl;
    cout << (p2)[0][1] << endl;
    cout << (p2)[1][0] << endl;
    cout << (p2)[1][1] << endl;

    return 0;
}

int(*p2)[2]와 같은 문법에 주의하여야 한다.

 

2. 포인터에서 함수의 주소를 외부로 반환하기(매우 위험함!)

int* TestPointer()
{
    int a = 1;
    return &a;
}

void TestWrong(int* ptr)
{
    int a[100] = {};
    a[99] = 0xAAAAAAAA;
    *ptr = 0x12341234;
}

int main()
{
    int* pointer = TestPointer();

    TestWrong(pointer);
}

다음과 같이 고의적으로 스택 프레임을 침범하면 충돌이 발생하지만, 릴리즈 모드에서는 문제가 없어보이기 때문에 나중에 문제가 될 수 있다.

'기초 C++ 스터디' 카테고리의 다른 글

5-0. 객체 지향  (0) 2023.05.25
번외) 파일 분할 관리  (0) 2023.05.25
4-10. 다차원 배열  (0) 2023.05.23
4-9. 멀티 포인터  (0) 2023.05.23
4-7. 포인터 vs 배열  (0) 2023.05.22