• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

배열이름 포인터 관련 질문드립니다.

21.07.20 16:35 작성 조회수 299

0

안녕하세요? 강의를 보다가 궁금한 점이 생겨 질문드립니다.

Q1. 10번줄과 15번줄을 비교했을 때, 둘 다 배열의 이름을 넣었지만  전자는 주소값이 출력이 되고 후자는 문자열이 출력되는 이유가 궁금합니다. (아마 타입형이 달라서 이러한 결과가 나타는것 같은데 어떠한 원리인지 궁금합니다.)

Q2. 8번줄과 13번줄을 비교했을때, 전자는 주소값이 출력이 되고 후자는 문자열이 출력되는 이유가 궁금합니다. (13줄은 배열의 첫번째요소에 &를 붙였으니 주소값이 출력될것을 기대하고있었는데 문자열이 출력되었습니다.)

Q3. C언어의 printf는 출력할때 서식문자를 지정했지만, C++의 cout은 서식문자를 지정하지 않고있습니다.  cout이 내부적으로 어떻게 값을 출력하는지 궁금합니다. 

감사합니다.

답변 2

·

답변을 작성해보세요.

2

안소님의 프로필

안소

2021.07.20

1. cout 은 char 배열 혹은 char 포인터가 들어오면 문자열로 인식하여 주소값이 아닌 그 문자열 내용을 출력하게끔 설계가 되어 있기 때문입니다. 즉, char 배열 이름을 넘기면 그 배열 이름 값(=첫번째 원소의 주소값)이 아닌 그 주소에 해당하는 문자열부터 '\0' 을 만날 때까지 출력이 되게끔 구현이 되어 있습니다. 그렇기 때문에 진짜 주소값을 출력하고 싶다면 배열이름에 &을 붙여서 넘겨야 합니다.

(배열이름 = &배열이름 이 둘이 값이 같긴 하지만 타입은 다릅니다. 배열이름은 타입이 char *, &배열이름은 타입이 char *[n] 대충 이런 것일겁니다! cout은 char * 타입의 데이터가 << 연산의 피연산자로 들어오면 그 값 그대로가 아닌 그 값이 가리키는 데이터를 연속적으로, 즉 문자열을 출력하게끔 구현이 되어있는 것입니다.)

2. 1번 답변으로 설명이 될 것 같습니다.

3. printf 는 함수이지만 cout 은 객체입니다. cout 은 ostream 클래스로부터 만들어진 객체입니다. (이 클래스는 iostream 헤더에 정의가 되어 있구요!) 그러니 ostream 클래스에서 << 연산자를 만나면 어떠어떠하게끔 출력 일을 해라! 이런식으로 정의가 되어있을 것 같네요! (9단원에서 입출력 연산자 오버로딩을 배우시면 이해가 되실겁니다.)

0

서켠님의 프로필

서켠

질문자

2021.07.21

답변 감사합니다. 추가적으로 질문드려요. 

char name[] = "Hello world!";

이렇게 배열의 첫번째 요소의 주소값을 출력하고싶을땐 형변환을 해주는 방법밖에없나요?

안소님의 프로필

안소

2021.07.21

이런식으로 하는 방법도 있습니다. 

일단 배열 이름 그대로는 안될 것 같구요 (문자열 내용으로 출력해주니까요) 배열 이름에 & 를 붙여보세요! 두번째 원소의 주소를 출력하고 싶다면 포인터 산술연산에서 배우신대로 +1 해주시면 됩니다. 

서켠님의 프로필

서켠

질문자

2021.07.23

포인터연산이 있었네요. 감사합니다:)