프로그래밍 언어/C

04. 포인터와 문자열

coding-l7 2025. 6. 26. 12:01

🧠 포인터와 문자열

  • 🧩 포인터
    • 32비트 시스템에서는 4바이트를 가지며,
    • 64비트 시스템에서는 8바이트 크기를 가진다.
  • 🧵 문자열(String)은 끝에 '\0'이라는 널 문자(null character)를 포함한다.
  • 🔒 포인터가 가리키는 값은 변경 가능하지만, 배열 이름은 포인터 상수이기 때문에 그 값을 변경할 수 없다.

🔍 문자열 선언 방식의 차이

🧱 배열 방식

char str1[] = "My string"; // str1은 포인터 상수 (주소 값 변경 X)
char * const str2 = str1;  // 위와 동일
  • 📦 문자열 "My string"이 배열로 복사되어 저장됨
  • str은 배열 이름이며, 해당 문자열 데이터를 직접 포함
  • ✅ 각 문자는 수정 가능 (예: str[0] = 'm';)
  •  str은 포인터 상수이므로 str = 다른주소; 는 불가능

🧭 포인터 방식

const char *str1 = "Your String";     // 상수를 가리키는 포인터
char const *str2 = "Your String";     // 위와 동일
  • 🎯 str은 문자열의 시작 주소('Y')를 가리키는 포인터
  • ✅ 주소 변경 가능 (예: str = "Another";)
  • ❌ 문자열 자체는 수정 불가능
    (예: str[0] = 'y';  정의되지 않은 동작 / Segmentation Fault 가능)

🔐 상수를 가리키는 포인터 상수

const char * const str1 = "Your String";     // 상수를 가리키는 포인터 상수
char const * const str2 = "Your String";     // 위와 동일
  • ❌ 가리키는 주소 변경 불가능
  • ❌ 가리키는 값도 변경 불가능

📤 함수 인자로서의 사용

void printStr(char *str) {
    printf("%s", str);
}
  • 문자열은 함수 인자로 넘길 때 보통 char* 타입을 사용
  • char str[]도 함수 인자에서는 암묵적으로 char*로 변환됨

요약

구분 주소 변경 값 변경 설명
🧱 char str[] = "abc" ❌ 불가능 ✅ 가능 배열로 선언, 문자열이 복사되어 포함됨
🧭 char *str = "abc" ✅ 가능 ❌ 불가능 리터럴 가리킴, 값 변경 시 오류 발생 가능
🔐 const char * const str = "abc" ❌ 불가능 ❌ 불가능 주소와 값 모두 상수
📤 함수 인자 char* str ✅ 가능 ✅ 가능 보통 문자열 인자로 사용