문자열 상수와 문자열 변수
char *s1 = "Hello"; char s2[6] = "Hello";
s1은 프로그램이 로딩될 때 정적영역
에 "Hello" 를 저장한 후 시작 주소를 s1에 대입
s1 자체는 변경이 가능한 포인터 변수이지만, s1이 가리키고 있는 문자열은 문자열 상수이므로 문자열을 변경할 수 없다.
반대로 s2는 힙 영역
에 메모리를 할당한 후 "Hello"를 이곳에 저장했다. 따라서 s2에 담겨 있는 문자열은 변경이 가능.
s1 = s2;
는 가능할까??
s1은 "Hello"라는 문자열 주소 자체를 반환한다.
s2는 s2[0]의 주소, 즉 배열의 시작 위치를 말한다.
예시를 들자면,
int a = 0; int b = 30; &a = b;
와 유사하다.
하지만
s2 = s1;
은 가능하다.
결론
문자열을 초기화할 때 배열은 배열 원소를 변경할 수 있지만, 포인터는 배열의 원소를 바꿀 수 없다. 즉, 포인터로 초기화 한다면 상수적인 성격을 띈다.
공감하며 읽었습니다. 좋은 글 감사드립니다.