본문 바로가기
공부/C언어

[C언어] 포인터 상수 형태의 문자열과 포인터 배열 개념 정리

by 현구원 2025. 5. 11.
반응형

 C언어에서는 문자열과 포인터를 사용하는 방법이 다양합니다. 특히 문자열을 선언하는 방식에 따라 값의 변경 가능 여부가 달라지고, 포인터를 배열로 사용할 수도 있습니다. 이번 글에서는 상수형태의 문자열, 그리고 포인터 배열에 대해 정리해보겠습니다.


📌 I. 상수 형태의 문자열이란?

문자열을 선언하는 방식은 크게 두 가지로 나눌 수 있습니다.

✅ 1. 배열 기반 문자열 선언

char str1[] = "My string";
  • "My string"이라는 문자열이 배열에 저장됩니다.
  • str1은 상수 포인터이지만, 배열 자체는 변수이므로 값의 변경이 가능합니다.
  • 따라서 str1[0] = 'H'; 와 같은 수정이 가능합니다.

📌 이 방식을 "변수 형태의 문자열"이라고 합니다.


✅ 2. 포인터 기반 문자열 선언

char *str2 = "My string";
  • "My string"은 컴파일 타임에 **문자열 상수 풀(RODATA)**에 저장됩니다.
  • str2는 해당 주소를 가리키는 포인터 변수이며, 가리키는 주소는 변경 가능합니다.
  • 하지만 문자열 자체는 상수이므로 값의 변경은 불가능합니다.
str2 = "Another string";  // 가능 (주소 변경)
str2[0] = 'H';            // 불가능! (런타임 에러 발생)

📌 이 방식을 "상수 형태의 문자열"이라고 부릅니다.


📊 배열 기반 vs 포인터 기반 문자열 비교

구분 배열 기반 선언 (char str[]) 포인터 기반 선언 (char *str)
저장 위치 스택(Stack) 또는 전역 공간 읽기 전용 메모리(RODATA)
값 변경 가능 여부 가능 불가능
가리키는 주소 변경 가능 불가능 가능
예시 char str[] = "abc"; char *str = "abc";

📌 II. 포인터 배열이란?

포인터도 변수이기 때문에 배열로 선언할 수 있습니다. 포인터 배열은 말 그대로 포인터들을 요소로 가지는 배열입니다.

✅ 포인터 배열 선언

int *ptrs[3];  // int형 포인터 3개를 요소로 갖는 배열

이 구조를 사용하면, 각 요소가 각각 다른 변수나 배열을 가리킬 수 있어 유연한 설계가 가능합니다.

✅ 문자열 포인터 배열 예시

char *messages[] = {
    "Hello",
    "World",
    "C Language"
};
  • messages[0]은 "Hello"의 주소를 가리킵니다.
  • messages[1], messages[2]도 마찬가지로 다른 문자열 상수들의 주소를 저장합니다.
  • 반복문을 통해 문자열 목록을 쉽게 처리할 수 있습니다.
for (int i = 0; i < 3; i++) {
    printf("%s\n", messages[i]);
}

💡 마무리 정리

  • 배열로 선언한 문자열은 값 변경이 가능하지만, 포인터로 선언한 문자열은 변경이 불가능합니다.
  • 포인터를 배열로 선언하면, 여러 개의 메모리 주소를 저장하고 유동적으로 활용할 수 있습니다.
  • 특히 문자열을 배열 형태로 다룰 때 유용하게 사용됩니다.
반응형