#include <iostream>
using namespace std;
// 오늘의 주제: 다중 포인터
void SetNumber(int* a)
{
*a = 1;
}
/*
* 에서 const가 별표 전에 오느냐 뒤에 오느냐에 따라 의미가 다른데
별표 전에 오면 msg 자체는 다른 주소로 교체 가능하되 (msg는 주소를 담는 바구니죠),
실제 그 주소를 타고 가서 있는 데이터 (char)를 바꿀 수 없다는 의미입니다.
반면 const가 별표 뒤에 오면, 포인터 값 자체를 바꿀 수 없게 됩니다.
*/
void SetMessage(const char* msg)
{
// msg 매개변수는 스택에 추가로 생성된다.
// 즉 main 함수의 msg와는 다른 메모리 공간에 저장된다.
// 즉, 값복사가 이루어진것.
msg = "Bye"; // r/o 데이터 영억에 저장된 bye 데이터의 주소를 msg에 복사
cout << msg << endl;
}
// 포인터의 포인터
void SetMessage2(const char** msg)
{
*msg = "Bye"; // r/o 데이터 영억에 저장된 bye 데이터의 주소를 *msg에 복사
cout << *msg << endl;
}
int main()
{
// "Hello"라는 문자열의 타입은?
cout<< typeid("Hello").name() << endl; // const char[6]
// char* 에서 문자열의 초기화 방식은
// 상수 문자열 데이터를 Data영역에 생성하고 그 주소를 넘겨주는 방식
// "Hello"라는 상수값의 주소를 test에 저장, Hello의 저장 공간 자체는 못 바꿈
// 그러나 test라는 포인터 값 자체는 다른 주소로 바꿀 수 있음
const char* test = "Hello";
int a = 0;
SetNumber(&a);
cout << a << endl;
const char* msg = "Hello";
SetMessage(msg);
cout << msg << endl;
SetMessage2(&msg);
cout << msg << endl;
return 0;
}