C언어 문자열 포인터 (char *)
요약
C언어 문자열 포인터의 핵심 개념을 알아봅니다. char *와 char []의 차이, 문자열 리터럴과 포인터의 관계, %s와 %c 출력 차이를 정보처리기사 실기 대비 핵심 내용으로 정리합니다.
문자열 포인터 핵심 정리
| 개념 | 설명 | 예시 |
|---|---|---|
| 문자열 포인터 | 문자열의 시작 주소를 저장하는 포인터 | char *p = "ABC"; |
| 문자열 리터럴 | 읽기 전용 메모리에 저장된 문자열 | "HELLO" |
char * vs char [] | 포인터 vs 배열, 수정 가능 여부가 다름 | 아래 설명 참조 |
문자열 포인터란?
문자열 포인터는 문자열의 시작 주소를 저장하는 포인터입니다.
문자열 리터럴 "HELLO"는 메모리에 저장된 char 배열이고, 그 시작 주소가 포인터 p에 저장됩니다.
char *와 char []의 차이
두 선언 모두 "HELLO"라는 문자열을 다루지만, 동작 방식이 다릅니다.
| 구분 | char *p = "HELLO" | char arr[] = "HELLO" |
|---|---|---|
| 저장 방식 | p는 문자열 리터럴의 주소를 저장 | arr에 문자열을 복사하여 저장 |
| 수정 가능 여부 | 수정 불가 (읽기 전용) | 수정 가능 |
| 다른 문자열 가리키기 | 가능 (p = "BYE") | 불가능 |
문자열 포인터로 값 읽기
배열 인덱싱과 포인터 역참조
문자열 포인터에서 특정 위치의 문자를 읽는 방법은 두 가지입니다.
p[i]와 *(p + i)는 완전히 동일합니다.
%s와 %c의 차이
printf에서 문자열 포인터를 출력할 때, 형식 지정자에 따라 결과가 달라집니다.
%s — 해당 주소부터 널 문자까지 출력
%c — 해당 주소의 문자 하나만 출력
| 코드 | 형식 | 의미 | 출력 |
|---|---|---|---|
printf("%s", p) | 문자열 | p 주소부터 '\0'까지 | KOREA |
printf("%s", p + 3) | 문자열 | p+3 주소부터 '\0'까지 | EA |
printf("%c", *p) | 문자 | p가 가리키는 한 문자 | K |
printf("%c", *(p + 3)) | 문자 | p+3이 가리키는 한 문자 | E |
문자열 리터럴은 주소다
문자열 리터럴 "HELLO"는 그 자체가 메모리 주소입니다. 따라서 문자열 리터럴에 직접 포인터 산술을 사용할 수도 있습니다.
이 원리는 구조체 멤버가 const char * 타입일 때도 동일하게 적용됩니다.
t.g는 "DC"의 시작 주소이므로, t.g + 1은 두 번째 문자 'C'의 주소입니다. %s로 출력하면 "C"가 출력됩니다.
배열 이름도 포인터처럼 동작
char 배열의 이름은 첫 번째 요소의 주소입니다. 따라서 배열 이름을 char * 포인터에 저장할 수 있습니다.
| 표현 | 의미 | 값 |
|---|---|---|
a | 배열의 시작 주소 (= &a[0]) | 주소 |
p | a의 시작 주소를 저장 | 주소 |
*a | 배열의 첫 번째 문자 | 'A' |
*p | p가 가리키는 문자 | 'A' |
a[1] | 배열의 두 번째 문자 | 'r' |
p[1] | 포인터로 접근한 두 번째 문자 | 'r' |
문자열 포인터와 함수
문자열을 함수에 전달할 때 char * 매개변수를 사용합니다.
문자열 길이 계산
포인터 p를 p++로 한 칸씩 이동시키면서 널 문자를 만날 때까지 세는 방식입니다.
const char * — 읽기 전용 포인터
const가 붙으면 포인터가 가리키는 값을 수정할 수 없습니다. 원본 문자열을 보호할 때 사용합니다.
const char *s는 원본(source)을 읽기만 하고, char *d는 대상(destination)에 쓰기를 합니다. 문자열 복사에서 자세히 다룹니다.