#include <iostream>
using namespace std;
// 오늘의 주제: 포인터 마무리
// 1) 포인터 vs 배열 2탄
// 2) 주의사항 (마음가짐?)
// 절대 이런 함수를 만들지 마
int& Test()
{
int a = 0;
// 지역 변수를 반환?
// 지역 변수는 함수가 끝나면 사라짐
return a;
}
// 절대 이런 함수를 만들지 마2
int* Test2()
{
int a = 0;
// 지역 변수를 반환?
// 지역 변수는 함수가 끝나면 사라짐
return &a;
}
int main()
{
// ==포인터==
// 주소를 담는 바구니
// 진퉁은 저~ 멀리 어딘가에 있음
// p는 단지 그 곳으로 워프하는 포탈
int* p;
// ==배열==
// 진짜배기! 원조 데이터
// 닭장처럼 데이터의 묶음 (엄청 많고 거대함)
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 그런데 배열 == 포인터 라고 착각하는 경향이 많음
// [배열의 이름]은 배열의 시작 주소를 가리키는 TYPE* 포인터로 변환 가능!
p = arr;
// [TYPE형 1차원 배열]과 [TYPE*형 포인터]는 완전히 호환 된다.
//cout << p[0] << endl;
//cout << arr[0] << endl;
//cout << *p << endl;
//cout << *arr << endl;
//cout << *(p + 1) << endl;
//cout << *(arr + 1) << endl;
// == 2차원 배열 vs 다중 포인터 ==
int arr2[2][2] = { { 1, 2 }, {3, 4} };
// int** pp = arr2; // 오류!
int** pp = (int**)arr2; // 강제로 형변환?? -> 2차원 배열의 시작 주소를 2차원 배열의 주소로 변환
cout << arr2 << endl; // -> 2차원 배열의 시작 주소
cout << *arr2 << endl; // -> 1차원 배열의 시작 주소
cout << **arr2 << endl; // -> 1차원 배열의 첫번째 원소?
cout << pp << endl; // -> 2차원 배열의 시작 주소?
cout << *pp << endl; // -> 1차원 배열의 시작 주소? X -> 1출력
//cout << **pp << endl; // -> 1차원 배열의 첫번째 원소? X -> 1이라는 주소로 이동
// 그럼 어떻게?
// 포인터의 배열 vs 배열의 포인터
// 참고로 이런거 써먹을 일 없음
int(*p2)[2] = arr2; // 2는 2개짜리 1차원 배열을 가리키는 포인터
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;
int test = Test();
cout << "TEST: " << test << endl; // 결과가 잘 나올수도 있음 근데 이건 운이 좋은거
return 0;
}