본문 바로가기
프로그래밍/C언어

6.3 포인터와 문자열 연산

by 밤이씌 2025. 3. 26.

6.3 포인터와 문자열 연산

문자열과 포인터, 둘 사이의 미묘한 관계를 알면 C 프로그래밍이 3배는 쉬워집니다!

안녕하세요, 문자열과 포인터 개념에서 벽을 느끼신 분 많으시죠? 저도 처음 C 언어를 배울 때, 문자열은 어렵지 않다고 생각했어요. 그런데 포인터가 끼어들자마자 머릿속이 하얘지더라고요. char *p = "hello"; 이 문장이 의미하는 걸 이해하는 데 시간이 꽤 걸렸어요. 하지만 이 개념을 제대로 잡고 나서 문자열 연산이 훨씬 더 유연하고 강력하게 느껴졌습니다. 오늘은 포인터로 문자열을 다루는 법, 연산에서 주의할 점 등을 예제와 함께 소개해드릴게요. 직접 써보며 익히면 어렵지 않답니다!

1. 문자열을 가리키는 포인터의 원리

char *str = "hello"; 이 문장에서 포인터 str은 문자열 "hello"의 시작 주소를 가리키고 있어요. 이처럼 문자열 리터럴은 메모리의 상수 영역에 저장되며, 포인터는 그 위치를 참조합니다. 하지만 이 문자열은 수정 불가능한 읽기 전용이라는 점, 꼭 기억하세요!

2. 포인터를 이용한 문자열 순회

배열 인덱스 없이도 포인터만으로 문자열을 순회할 수 있어요. 반복문에서 포인터 연산을 통해 문자 하나씩 접근하는 방식은 매우 직관적이고 강력합니다.

코드 설명
char *p = "hello";
while (*p) {
  printf("%c ", *p);
  p++;
}
포인터가 널 문자 이전까지 순회하며 문자 출력

3. 수정 가능한 포인터 vs 상수 문자열

char *str = "hello";char str[] = "hello";의 차이를 정확히 이해해야 해요. 전자는 상수 문자열을 가리키는 포인터라 수정 시 오류가 날 수 있고, 후자는 배열로 선언돼 수정이 가능해요.

  • char *s = "hi"; s[0] = 'H'; → 런타임 오류 발생 가능
  • char s[] = "hi"; s[0] = 'H'; → 정상 작동

4. 배열 접근과 포인터 접근의 차이

문자열을 다룰 때는 배열처럼 str[i]로 접근할 수도 있고, 포인터 연산 *(str + i)를 사용할 수도 있어요. 둘은 기능적으로 같지만, 상황에 따라 더 유리한 방식이 있답니다. 예를 들어 반복문에서는 포인터가 더 직관적이고 성능상 이점도 있을 수 있어요.

5. 문자열 함수에서 포인터 활용하기

strlen(), strcpy(), strcmp() 등 대부분의 문자열 함수들은 포인터를 인자로 받아요. 즉, 배열이든 포인터든 주소값만 전달되면 문제없이 작동해요. 이 때문에 포인터와 문자열 함수는 매우 밀접하게 연관되어 있습니다.

함수 포인터 기반 사용 예시
strlen() strlen(ptr) → ptr이 문자열 시작 주소
strcpy() strcpy(dest, src) → dest, src 모두 포인터
strcmp() strcmp("abc", ptr) → 문자열 상수와 포인터 비교

6. 실전 예제로 익히는 포인터 트릭

실무에서는 문자열 조작을 포인터로 더 유연하게 처리할 수 있어요. 특히 부분 문자열 잘라내기, 특정 위치 탐색, 조건부 출력 등에 유용하죠.

  • while (*p != '\0' && *p != ' ') p++; → 공백까지 탐색
  • char *sub = strstr(str, "find"); → 찾은 부분부터 출력 가능
  • *(p + i)p[i]는 동일하지만 포인터 연산은 더 유연
Q 문자열을 포인터로 선언하면 왜 수정이 안 되나요?

문자열 리터럴은 읽기 전용 메모리 영역에 저장돼 있어서 포인터를 통해 수정하려 하면 오류가 발생합니다.

Q 포인터로 문자열 순회할 때 종료 조건은 어떻게 설정하나요?

널 문자('\0')가 나올 때까지 반복문을 돌리는 게 기본이에요. while (*p) 형식이 가장 흔하죠.

Q 배열로 선언한 문자열은 왜 수정이 가능한가요?

char str[] = "hello"; 형태는 문자열을 스택 메모리에 복사한 배열로 만들기 때문에 내용을 수정할 수 있어요.

Q 문자열 함수들이 왜 포인터를 받나요?

문자열은 사실 문자 배열의 시작 주소이기 때문에 함수에서 포인터로 처리하는 게 자연스럽고 유연하기 때문이에요.

Q *(p+i) 와 p[i] 는 정확히 같은 건가요?

네, 같은 값을 반환해요. 배열 표기법도 결국 포인터 연산으로 처리되기 때문에 기능적으로 동일합니다.

Q 문자열과 포인터 개념은 왜 이렇게 중요할까요?

C 언어에서 문자열 처리는 대부분 포인터 기반으로 이뤄지기 때문에, 정확한 개념 이해가 메모리 오류 예방과 성능 개선에 필수예요.

문자열과 포인터, 처음엔 복잡하고 어려워 보이지만 원리를 제대로 이해하고 나면 정말 강력한 무기가 됩니다. 특히 포인터를 활용한 문자열 연산은 효율적이고 유연한 코드 작성을 가능하게 해줘요. 직접 다양한 방식으로 출력해보고, 수정해보고, 비교해보는 연습을 하다 보면 자연스럽게 익숙해지실 거예요. 실전에서 문자열을 다룰 때, 오늘 배운 포인터 개념이 확실한 차이를 만들어 줄 겁니다. 혹시 더 궁금한 내용이나 헷갈리는 부분 있다면 댓글로 남겨주세요. 같이 성장해요!

문자열포인터, C언어기초, 문자열연산, 포인터순회, 문자열함수, 배열과포인터, 문자열비교, 메모리접근, 널문자, 문자열주소

댓글