인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

박준영님의 프로필 이미지
박준영

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

TextRPG #3

void PrintMessage(const char* msg) 함수가 헷갈립니다..

작성

·

458

0

cout << "**************************" << endl;

cout << msg << endl;

cout << "**************************" << endl;

msg는 "로비에 입장했습니다." 문자열의 주소를 가지고 있는거니까 문자열을 출력하려면 cout << *msg << endl;로 해야 맞는게 아닌가요...?? msg가 가지고 있는 주소값에 접근한 값을 출력하는거니까...? 이해했다고 생각했는데 바로 헷갈려버리네요ㅠㅠ

답변 2

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

1.
네 문자열의 주소값이 맞습니다.


위처럼 영어로 테스트 하면,
정상적으로 각 1 바이트 = 1 영어 문자이기 때문에
H e l l o W o r l d가 있는 것을 확인할 수 있습니다.
테스트하실 때 메모리 쪽에서 ???? 로 뜨는 것은 한국어라서 그렇게 뜨는겁니다.
영어는 아스키 코드 (1바이트)로 모든 문자를 표현할 수 있지만
한국어, 중국어, 일본어 등의 언어는 1바이트로는 모든 문자를 표현할 수 없기에
utf8 등 다양한 유니코드로 문자를 저장하는데
그럴 경우 1 바이트 = 1문자 라는 공식이 성립하지 않기 때문에
저렇게 물음표로 뜨는 것입니다.

2.
위와 같이 강제로 정수로 만들어서 출력하면 실제 주소값이 출력됩니다.

박준영님의 프로필 이미지
박준영
질문자

아 넵 완벽하게 이해했습니다! 감사합니다~~~

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

operator << 는 온갖 타입 별로 동작하게 재정의(overloading)이 되어 있어서,
char*를 전달하면 찰떡같이 알아듣고 문자열을 출력해주게 됩니다.

박준영님의 프로필 이미지
박준영
질문자

아직 이해가 잘 가지 않아서 질문 두가지만 하겠습니다ㅠㅠ

1. 제가 이해하기로는 msg는 *가 붙어있으니까 주소값을 저장하는 포인터고, 디스어셈블리에 msg를 입력해보니 f1baceb7이라는 값이 나오는데 "f1baceb7"가 "로비에 입장했습니다" 문자열의 주소값이 되는건가요? 아니면 "로비에 입장했습니다."가 유니코드로 저장되어있는건가요...? 저는 문자열의 주소값이 저장된다고 이해해서 0x71baceb7 주소에 "로비에 입장했습니다"가 저장되있을거라고 예상했는데 ????????가 저장되어있더라구요..ㅠㅠ

2. 그리고 << 연산자에 char*를 넘겨주면 찰떡같이 알아듣고 문자열을 출력해준다고 하셨는데, 그럼 찰떡같이 알아듣지 말고 그냥 주소값을 출력해달라고 하고싶으면 뭘 넣어야하는건가요...?

박준영님의 프로필 이미지
박준영

작성한 질문수

질문하기