오랜만에 그림으로 시작하는 것 같다. ㅎㅎ.. 항상 코드만 주구장창 나열한 느낌이 있었는데 말이지,,,, 우선 그림을 보자.
compiler가 실행하기도 전에 문제가 있다고 가르킨다. 오른쪽에 있는 것은 literal인데 이 literal을 담을 변수가 포인터 변수이므로 문제가 생기는 것이다. R-Value인 literal은 주소를 갖고 있지 않은 마치 청정수(?) 같은 느낌이다. literal을 주소를 담아야 하는 포인터 변수에 넣으니 문제가 생기는 것이다. 이는 매우 중요한 개념이다.
하지만 이 literal을 심볼릭 상수처럼 사용할 수가 있다. const
를 붙이면 된다.
#include <iostream>
using namespace std;
int main()
{
//char name[] = "Jun Woo";
const char *name = "Jun Woo";
const char *name2 = "Jun Woo";
cout << (uintptr_t)name << endl;
cout << (uintptr_t)name2 << endl;
return 0;
}
output : 16489264
16489264
근데? 왜 메모리 주소가 같지? 분명히 포인터 변수 이름은 다른데 말이다.. 이것이 신기한 장점이면서 단점이다. 같은 문자열이라서 같은 메모리를 쓰라고 compiler가 알려준 것인데, 한번 문자열 한글자를 추가해서 확인해보자.
#include <iostream>
using namespace std;
int main()
{
//char name[] = "Jun Woo";
const char *name = "Jun Woo";
const char *name2 = "Jun Woo1";
cout << (uintptr_t)name << endl;
cout << (uintptr_t)name2 << endl;
return 0;
}
output : 4102960
4103128
두 메모리 주소가 다른 것을 볼 수 있다. 즉, 문자열이 달라지면 다른 메모리 공간에 저장하는 구나! 라고 생각하자.(지금은) 현재 우리가 알고 있는 내용으론 자세하게 설명할 수 없다.
#include <iostream>
using namespace std;
const char* getName()
{
return "Jun WOO";
}
int main()
{
//char name[] = "Jun Woo";
const char *name = getName();
const char *name2 = getName();
cout << (uintptr_t)name << endl;
cout << (uintptr_t)name2 << endl;
return 0;
}
output : 16423728
16423728
위의 코드를 함수로 만들어 출력해도 결과는 같은 것을 보여준다. 확실히 포인터가 메모리를 다루다 보니 소실되는 정보가 없는 것이 매력적인듯!!!
또 자료형마다 출력되는 값이 다를 수 있는데, 이게 무슨말인가 하면 코드를 보자!
#include <iostream>
using namespace std;
int main()
{
int int_arr[5] = { 1, 2, 3, 4, 5 };
char char_arr[] = "Hello, World";
const char *name = "Jun Woo";
cout << int_arr << endl;
cout << char_arr << endl;
cout << name << endl;
return 0;
}
output : 0076FE78
Hello, World
Jun Woo
이 부분도 우리가 지금까지 배운 내용으론 설명이 안된다. ㅠㅠ 나도 공부중이여서 아직 자세한 건 모르겠다 흑 ( ̄ ‘i  ̄;) 우선은 cout
에서 문자열은 특별히 처리한다 라고만 알아두자.