해결된 질문
작성
·
432
0
안녕하세요? 강의를 보다가 궁금한 점이 생겨 질문드립니다.
Q1. 10번줄과 15번줄을 비교했을 때, 둘 다 배열의 이름을 넣었지만 전자는 주소값이 출력이 되고 후자는 문자열이 출력되는 이유가 궁금합니다. (아마 타입형이 달라서 이러한 결과가 나타는것 같은데 어떠한 원리인지 궁금합니다.)
Q2. 8번줄과 13번줄을 비교했을때, 전자는 주소값이 출력이 되고 후자는 문자열이 출력되는 이유가 궁금합니다. (13줄은 배열의 첫번째요소에 &를 붙였으니 주소값이 출력될것을 기대하고있었는데 문자열이 출력되었습니다.)
Q3. C언어의 printf는 출력할때 서식문자를 지정했지만, C++의 cout은 서식문자를 지정하지 않고있습니다. cout이 내부적으로 어떻게 값을 출력하는지 궁금합니다.
감사합니다.
답변 2
2
1. cout 은 char 배열 혹은 char 포인터가 들어오면 문자열로 인식하여 주소값이 아닌 그 문자열 내용을 출력하게끔 설계가 되어 있기 때문입니다. 즉, char 배열 이름을 넘기면 그 배열 이름 값(=첫번째 원소의 주소값)이 아닌 그 주소에 해당하는 문자열부터 '\0' 을 만날 때까지 출력이 되게끔 구현이 되어 있습니다. 그렇기 때문에 진짜 주소값을 출력하고 싶다면 배열이름에 &을 붙여서 넘겨야 합니다.
(배열이름 = &배열이름 이 둘이 값이 같긴 하지만 타입은 다릅니다. 배열이름은 타입이 char *, &배열이름은 타입이 char *[n] 대충 이런 것일겁니다! cout은 char * 타입의 데이터가 << 연산의 피연산자로 들어오면 그 값 그대로가 아닌 그 값이 가리키는 데이터를 연속적으로, 즉 문자열을 출력하게끔 구현이 되어있는 것입니다.)
2. 1번 답변으로 설명이 될 것 같습니다.
3. printf 는 함수이지만 cout 은 객체입니다. cout 은 ostream 클래스로부터 만들어진 객체입니다. (이 클래스는 iostream 헤더에 정의가 되어 있구요!) 그러니 ostream 클래스에서 << 연산자를 만나면 어떠어떠하게끔 출력 일을 해라! 이런식으로 정의가 되어있을 것 같네요! (9단원에서 입출력 연산자 오버로딩을 배우시면 이해가 되실겁니다.)
이런식으로 하는 방법도 있습니다.
일단 배열 이름 그대로는 안될 것 같구요 (문자열 내용으로 출력해주니까요) 배열 이름에 & 를 붙여보세요! 두번째 원소의 주소를 출력하고 싶다면 포인터 산술연산에서 배우신대로 +1 해주시면 됩니다.