35.2 문자열 포인터에서 인덱스로 문자에 접근하기

포인터도 [ ] (대괄호)를 사용하여 인덱스로 접근할 수 있으니 이번에는 문자열에서 문자를 하나씩 출력해보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

string_pointer_element.c

#include <stdio.h>

int main()
{
    char *s1 = "Hello";       // 포인터에 문자열 Hello의 주소 저장

    printf("%c\n", s1[1]);    // e: 인덱스 1(두 번째)의 문자 출력
    printf("%c\n", s1[4]);    // o: 인덱스 4(다섯 번째)의 문자 출력
    printf("%c\n", s1[5]);    // 문자열 맨 뒤의 NULL(\0) 출력. NULL은 화면에 표시되지 않음

    return 0;
}

실행 결과

e
o

s1[1]처럼 문자열 포인터를 인덱스로 접근했고, printf에서 서식 지정자 %c로 문자를 출력하였습니다. 이렇게 문자열 포인터를 인덱스로 접근하면 char와 같기 때문에 %c로 출력할 수 있습니다.

문자열 포인터에서 문자열 맨 뒤의 문자를 가져와보면 NULL이 들어있습니다. NULLprintf로 출력해도 화면에 표시되지 않습니다.

문자열 포인터에서 인덱스로 문자를 가져왔으니 반대로 문자를 할당할 수도 있겠죠? 다음 내용을 소스 코드 편집 창에 입력한 뒤 F5 키를 눌러서 디버깅 모드로 실행해보세요.

string_pointer_element_assign_error.c

#include <stdio.h>

int main()
{
    char *s1 = "Hello";    // 포인터에 문자열 Hello의 주소 저장
                           // Hello가 있는 메모리 주소는 읽기 전용

    s1[0] = 'A';           // 문자열 포인터의 인덱스 0에 문자 A를 할당
                           // 실행 에러

    printf("%c\n", s1[0]);

    return 0;
}

실행 결과

0xC0000005: 0x00096BCC 위치를 기록하는 동안 액세스 위반이 발생했습니다.

실행을 해보면 문자열 포인터에 인덱스로 문자를 할당할 때 에러가 발생합니다. 왜냐하면 문자열 리터럴이 있는 메모리 주소는 읽기 전용이기 때문입니다. 따라서 문자열 포인터는 인덱스로 접근하여 문자를 할당하면 안 됩니다.