만약 const char* ch_ptr = "Hello"
가 있을 때 ch_ptr
은 read only data 영역(.rdata, 정적영역)에 저장되어 있는 "Hello"
라는 문자열의 주소를 가리키고 있는 '포인터'임.
따라서 const char*
의 크기는 32비트 운영체제에서 4바이트, 64비트 운영체제에서 8바이트로 고정되어 있음.
const
를 통해 상수화 되는 것은 ch_ptr의 '값', 즉 "Hello"
가 저장되어 있는 정적영역임.
따라서 *ch_ptr = "Bye"
처럼 '값'을 바꿀 수는 없음.
하지만 ch_ptr이 가리키는 '문자열 주소'는 변경이 가능함. (ex. ch_ptr = "Bye")
int num = 1 ==> num = 2
int
형 변수의 경우 아래와 같이 num의 주소값을 함수의 매개변수로 넣어주므로써 num의 값을 변경해줄 수가 있다. void SetNumber(int* num)
{
*num = 2;
}
int main()
{
int num = 1;
SetNumber(&num);
}
const char* ch = "Hello" ==> ch = "Bye"
const char*
을 마치 int
형과 같은 단순한 자료형으로 치환해서 생각하고 int
형과 같이 다뤄주는 것이다. 그럼 바로 답이 나온다.const char**
즉, const char*
의 주소값을 매개변수로하여 다루는 것이다. void SetString(const char** ch)
{
*ch = "Bye";
}
int main()
{
const char* ch = "Hello";
SetString(&ch);
}
#include <iostream>
using namespace std;
// 다중 포인터
// const char* ch1 의 값을 가져온다
// ex) void SetNumber1(int a) 와 같은 문법이라고 볼 수 있음
void SetString1(const char* a)
{
a = "After: SetString1";
}
// const char* ch1 의 주소를 가져온다
// 다중 포인터
// ex) void SetNumber1(int* a) 와 같은 문법이라고 볼 수 있음
void SetString2(const char** a)
{
*a = "After: SetString2";
}
// const char* ch1 의 주소를 가져온다
// 포인터의 레퍼런스(참조)
// ex) void SetNumber1(int& a) 와 같은 문법이라고 볼 수 있음
void SetString3(const char*& a)
{
a = "After: SetString3";
}
int main()
{
// ch1[ Before의 주소 ] << 8바이트(64비트에서)
// .rdata Before의 주소[B][e][f][o][r][e][\0]
const char* ch1 = "Before";
SetString1(ch1);
cout << ch1 << endl;
ch1 = "Before";
SetString2(&ch1);
cout << ch1 << endl;
ch1 = "Before";
SetString3(ch1);
cout << ch1 << endl;
// pp[ &ch1 ] << 8바이트
// ch1[ Before의 주소 ] << 8바이트(64비트에서)
// .rdata Before의 주소[B][e][f][o][r][e][\0]
const char** pp = &ch1;
*pp = "After: pp";
cout << ch1 << endl;
const char*& pr = ch1;
pr = "After: pr";
cout << ch1 << endl;
return 0;
}
Before
After: SetString2
After: SetString3
After: pp
After: pr