(C++) 6.8 문자열 심볼릭 상수

이준우·2021년 10월 19일
0

오랜만에 그림으로 시작하는 것 같다. ㅎㅎ.. 항상 코드만 주구장창 나열한 느낌이 있었는데 말이지,,,, 우선 그림을 보자.

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에서 문자열은 특별히 처리한다 라고만 알아두자.

profile
꿈꾸는 CV

0개의 댓글