• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

string에 대해 질문드립니다.

21.01.27 18:09 작성 조회수 137

0

안녕하세요. 강의를 보다 string타입을 사용하시는 것을 보고 아래와 같이 궁금증이 생겨서 한 번 실험해보았는데 왜 이렇게 되는지 잘 모르겠어서 질문드립니다.

#include <iostream>

#include <string>

using namespace std;

int main()

{

string hello = "Hello, my name is Jack Jack";

cout << hello << endl;

cout << &hello[0] << endl;

cout << &hello[1] << endl;

cout << &hello[2] << endl;

return 0;

}

->

Hello, my name is Jack Jack

Hello, my name is Jack Jack

ello, my name is Jack Jack

llo, my name is Jack Jack

이전에 문자 포인터의 특성 강의에서 cout에서는 문자열은 특별히 처리한다고 배웠고 문자열의 주소나 포인터를 출력해도 문자열이 그대로 출력된다고 배웠기 때문에 다음같이 앞에 &를 붙여서 출력했을 때 주소가 아니라 문자열이 그대로 출력될 것이라고 어느정도는 예상을 했습니다만 해당 index의 문자를 포함한 앞쪽의 문자들을 제외한 나머지 문자열이 출력되는 건지, 그리고 첫번째 element인 &hello[0]가 아닌 &hello[1]를 출력했을 때 H 이외의 문자열이 출력되는 것인지 궁금합니다.

감사합니다.

답변 1

답변을 작성해보세요.

9

안소님의 프로필

안소

2021.01.28

안녕하세요. 

첫째, 앞에서 배우셨을 포인터와 배열의 상관관계를 생각해주셔야 합니다. ptr[2]은 곧 *(ptr + 2) 와도 같습니다. 즉, 포인터 ptr이 가리키는 곳에서 2칸 더 간 것의 데이터나 마찬가지입니다. arr 이라는 배열이 있다면 arr[3]은 *(arr + 3)과도 같습니다. 즉, 배열의 이름인 arr에는 첫 번째 원소의 주소가 담겨있으니 이로부터 세 칸 더간 네 번째 원소를 가져오라는 의미와도 같습니다.

둘째, string 객체는 내부적으론 char 배열로 이루어져 있습니다. string str = "Hello"; 라면 str객체는 내부적으로 char 배열 멤버를 가지게 됩니다. {'H', 'e', 'l', 'l', 'o', '\0'}

셋째, cout을 통해 표준 출력을 할 때 char* 즉, char 데이터를 가리키는 포인터가 들어오면 '\0'을 만나는 부분까지 문자열 전체가 출력되도록  설계가 되어 있습니다. hello[1]은 string인 hello 객체 내부의 char 배열의 두 번째 원소인  'e' 나 마찬가지인 것을 이해하고 계실겁니다. &hello[1] 은 이 'e' 원소가 있는 곳의 주소를 말하며 이 자체의 타입은 char* 나 다름 없습니다. 따라서 이 'e'의 주소를 넘겨주었기 때문에 'e'가 있는 곳부터 문자열 전체를 출력하게 되는 것입니다. 그래서 "ello, my name is Jack Jack" 가 출력된 것입니다. 그냥 hello 를 출력시키면 이는 곧 &hello[0] 즉, 첫번째 원소의 주소를 넘긴 것이나 다름 없습니다. 그래서 이런 경우엔 첫번째 원소부터 문자열까지 끝까지 출력이 되는 것입니다.