39.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이 들어있습니다. NULL은 printf로 출력해도 화면에 표시되지 않습니다.
문자열 포인터에서 인덱스로 문자를 가져왔으니 반대로 문자를 할당할 수도 있겠죠? 다음 내용을 소스 코드 편집 창에 입력한 뒤 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 위치를 기록하는 동안 액세스 위반이 발생했습니다.
실행을 해보면 문자열 포인터에 인덱스로 문자를 할당할 때 에러가 발생합니다. 왜냐하면 문자열 리터럴이 있는 메모리 주소는 읽기 전용이기 때문입니다. 따라서 문자열 포인터는 인덱스로 접근하여 문자를 할당하면 안 됩니다.