#include <iostream>
using namespace std;
//다중 포인터
//삼차 포인터 이상의 포인터는 거의 쓰지 않는다
//밑의 예제와 같이 rdata에 저장된 문자열을 수정하고싶을 때 사용
void SetNumber(int* a) {
*a = 2;
}
// 문자열 상수를 직접 받기 때문에 const char형으로 인자를 받는다.
void SetMessage(const char* a) {
//a라는 포인터에 msg를 받았기 때문에 a는 지역변수로 msg를 단순히 복사한 변수
a = "Bye"; //.rdata에 저장된 Bye의 주소로 바구니 내의 주소를 변경
//즉 msg가 가진 주소로 접근하여 주소가 나타내는 값을 바꾸길 원했지만?
//사실은 복사된 지역변수 a가 가진 주소를 바꾼 것이다.
//주소를 직접 접근해서 바꾼 것이 아니고 지역변수의 값을 바꾼것과 마찬가지
//따라서 이 함수가 끝나면 지역변수는 소멸되므로 아무것도 바뀐 것이 없다.
cout << a << endl;
}
void SetMessage(const char** a) {
//위 함수와는 다르게 이중 포인터를 사용
//a라는 지역변수는 msg의 주소를 가지고 있기 때문에 msg에 직접 접근 가능
//따라서 *a는 msg로 직접 접근을 한 것이고 그 안에 있는 데이터를 .rdata에 저장되어 있는 bye의 시작주소로 바꿈
*a = "bye";
}
void SetMessage(const char*& a,int t) {
a = "wow";
}
int main()
{
int number = 1;
int* a;
a = &number;
const char* msg = "Hello"; //.rdata에 저장된 Hello의 주소를 불러옴
SetMessage(msg);
cout << msg << endl;
//pp[ 주소1 ] <<8바이트
//주소1[ 주소 2] <<8바이트
//주소2[ ] <<1바이트
const char** pp = &msg;
SetMessage(&msg);
SetMessage(msg,0);
cout << msg << endl;
return 0;
}