• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

2분39초에

21.07.24 02:41 작성 조회수 21

0

삭제된 글입니다

답변 1

답변을 작성해보세요.

1

안소님의 프로필

안소

2021.07.24

해당 강의에서는 설명 안해주신 것 같아요! 6.18 이전 강의들 중에서 이 부분을 어떤 강의에서 배우는지는 잘 모르겠지만 이유를 설명드리겠습니다. 

cout 에 "char 포인터" 가 피연산자로 들어가면 cout은 그 char 포인터에 저장되어 있는 값, 즉 누군가의 주소값을 출력하는 것이 아니라 문자열일거라고 파악하고 그 문자열 내용을 출력합니다.

예를 들어 char str[] = "hello"; 이고, cout << str; 를 하게 된다면 배열 이름 str 은 char 주소값을 가지기 때문에 cout 에 char * 타입의 값이 들어가는 셈입니다. 이때 str 값을 출력하는게 아니라, 즉 배열이름은 늘 첫번째 원소의 주소이니 &str[0] 값일테니 이 str[0] 의 주소값을 출력하는게 아니라 "hello" 를 출력합니다! 그냥 cout 자체가 이렇게 설계가 되어 있기 때문입니다. ㅎㅎ cout은 char * 타입의 값이 들어오면 얘는 좀 특별하게 그 주소값 그대로를 출력하는게 아니라 문자열 내용을 출력합니다.

그래서 cout << &a; 를 했을 때 char 문자 '내용'인 a 가 출력됨과 동시에 뒤에 외계어가 출력되었던 거에요! 문자열을 출력할 때 문자열의 끝을 나타내는 '\0' 가 나올 때까지 출력한다는 것을 알고 계실겁니다. char* 인 &a 가 cout 에 들어와서 cout 은 얘를 문자열로 받아들이고 문자열로서 출력하려고 했던거에요. 근데 '\0' 가 없으니 그 이외의 쓰레기 값이 들어있는, 전혀 상관없는 메모리 값까지 출력해서 저런 결과가 나온거에요! 

그래서 순수하게 char 포인터 값을 출력하고 싶다면 다른 방법을 사용해야 합니다.

cout << (void*)&a; 이렇게 a 를 char * 로 cout 에 들어가지 않도록 형변환 해주는게 좋을 것 같아요!

kansd님의 프로필

kansd

질문자

2021.07.25

 즉 누군가의 주소값을 출력하는 것이 아니라 문자열일거라고 파악하고 그 문자열 내용을 출력합니다.

윗말이 cout은 char* 타입을 만나면 주소값이 아니라 문자열을 출력한다

그 이유는 cout이 그렇게 설정이 되어있기 때문이다! 제가 이해한데로 적어봤는데 이게맞나여?? 

안소님의 프로필

안소

2021.07.25

네 맞습니다. 따라서 a 와 함께 이상한 값이 나온 이유는 cout이 문자열로 인식하여 '\0' 을 만날때까지 문자열 내용 출력을 시도하려는 과정으로 인한 것입니다.