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 |