티스토리 뷰

반응형

🔷 C언어 문자열 포인터와 서식문자 — 포인터와 문자열 출력의 모든 것

✅ 문자열과 포인터

C언어에서 문자열과 포인터는 밀접한 관계가 있습니다. 문자열은 사실 글자들이 메모리에 연속적으로 저장된 배열이며, 그 배열의 첫 번째 원소의 주소를 이용해 문자열 전체를 처리합니다.

예를 들어 다음과 같이 선언된 코드를 살펴보겠습니다.

char* p = "APPLE";
    

문자열 리터럴 "APPLE"은 프로그램 실행 시 메모리의 특정 영역에 저장됩니다. 이때 p는 그 메모리의 시작 주소, 즉 첫 글자 'A'가 저장된 위치를 가리키게 됩니다.

메모리 내부 상태는 다음과 같습니다.

메모리 주소
p A
p+1 P
p+2 P
p+3 L
p+4 E
p+5 \0

마지막에는 문자열의 끝을 알리는 널 종료 문자 \0가 자동으로 포함됩니다. 포인터 p가 문자열을 가진다는 것은 문자 배열의 시작 위치를 알고 있다는 뜻입니다.


✅ 포인터 연산과 문자열

포인터에 정수를 더하거나 빼면, 포인터가 가리키는 메모리 위치가 이동합니다. 문자열 포인터의 경우 글자 하나의 크기는 1바이트이므로 p+1은 두 번째 글자 'P'의 주소를 가리킵니다. 마찬가지로 p+2는 세 번째 글자, p+3은 네 번째 글자를 가리킵니다.

포인터 연산을 한 뒤 역참조(*)하면 해당 위치의 문자를 가져올 수 있습니다.

예시:

*p       // 첫 글자 'A'
*(p+1)   // 두 번째 글자 'P'
*(p+4)   // 다섯 번째 글자 'E'
    

포인터 연산 없이도 배열 첨자 표기법을 사용할 수 있으며, 아래 표현들은 완전히 동일하게 동작합니다.

p[0] == *p
p[1] == *(p+1)
p[4] == *(p+4)
    

✅ 서식문자 %s와 %c

🔷 %s — 문자열 출력

서식문자 %s는 문자열의 시작 주소를 전달받아 출력합니다. printf("%s\n", p);라고 하면 p가 가리키는 주소부터 널 종료 문자 \0이 나올 때까지의 문자를 연속적으로 출력합니다. 즉, p"APPLE"의 시작 위치라면 전체 문자열이 출력됩니다.

또한 포인터 연산을 이용해 문자열의 특정 위치에서부터 출력할 수도 있습니다.

printf("%s\n", p+1);  // PPLE
printf("%s\n", p+2);  // PLE
    

🔷 %c — 단일 문자 출력

서식문자 %c는 하나의 문자를 출력합니다. 포인터를 역참조해 해당 위치의 문자를 하나 출력하거나, 배열 첨자 표기법으로 특정 위치를 선택해도 됩니다.

printf("%c\n", *p);      // A
printf("%c\n", *(p+3));  // L
printf("%c\n", p[4]);    // E
    

문자열의 특정 위치에서 한 글자만 필요할 때 유용합니다.


✅ 정리

문자열을 출력할 때와 문자를 출력할 때는 포인터가 가리키는 대상은 같지만 출력 방식이 다릅니다. %s는 포인터가 가리키는 위치에서부터 연속된 문자열을 출력하고, %c는 해당 위치의 1바이트 값만 출력합니다. 또한 포인터에 정수를 더해 원하는 위치로 이동한 뒤 역참조하거나 배열처럼 첨자를 사용해 특정 문자를 선택할 수 있습니다.

문자열과 포인터, 그리고 서식문자의 동작 방식을 올바르게 이해하면 C언어의 문자열 처리에서 헷갈림 없이 정확하게 코드를 작성할 수 있습니다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함
반응형