🧠 포인터와 문자열
- 🧩 포인터는
- 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 |
✅ 가능 |
✅ 가능 |
보통 문자열 인자로 사용 |