본문 바로가기

Programming/C,C++

[char*, char[], const char* ] 문자열 상수, 문자열 변수 이해

반응형

char* s1 = "abc";

char s2[] = "abc";

 

위의 s1,s2는 어떻게 다를까?

언뜻 보기에 다르지만 완전히 다르다.

 

결론적으로 말하자면 s1은 문자열 상수, s2는 문자열 변수이다.

컴파일 하면서 s1이 가리킬 "abc"는 정적영역에서 생성되고 정적영역에서의 "abc"의 시작주소를 s1에 넣는다.

s2는 힙영역에 "abc"가 생성되고 그 시작주소를 s2에 넣는다. s2가 우리가 익히 알고있는 변수, 혹은 포인터 방식이다.

 

s1은 정적영역에 생성되었기 때문에 s1의 값을 바꾸지 못한다. 즉, 상수가 된것이다.

그러나 s1이 가리키는 대상은 바꿀 수 있다. 왜냐??

 

근본적으로 s1은 포인터이기 때문이다. 포인터라서 가리키는 대상은 바꿀 수 있지만, "abc"는 정적영역에 있기때문에 바꾸지 못할 뿐이다.

 

s2는 이후로도 값을 바꿀 수가 있다. 다만, s2는 배열의 시작주소값을 가리키는 상수이기 때문에 s2가 가리키는 메모리의 위치는 바꿀 수 없다. 다만 메모리 주소에 들어가는 값을 바꿀 수 있을 뿐이다.

 

char* 예시

s1 출력 결과

visual studio 에서는 char*를 const char*로 사용하지 않으면 에러가 나서 환경설정을 해줘야하는데 귀찮아서 qt에서 실행했다.

 

소스코드를 보면 s2의 주소를 s1에 넣었고, 출력은 s1의 주소가 시작되는 문자열을 출력했기 때문에 "bbbb"가 나온것을 볼 수 있다.

정확히 말해서 포인터로써 주소를 주고받은거지 문자열의 값을 바꾼것이 아니다.

 

 

 

 

 

"%s"와 "%c"는 엄연히 다르다. 

문자출력은 아스키코드를 출력하는 것이고

문자열 출력은 해당 주소로가서 \0이 나올때까지 쭉 출력하는 것이다.

 

만약 문자를 문자열처럼 출력한다면 어떻게 나올까???

왜 이런 결과가 나올까? 애초에 "%s"는 문자열의 시작 주소를 넘겨받는 인자인데 넘겨준 s1[0]은 아스키코드이다. 호환이 안되기 때문에 이런 에러가 나왔다.

그렇다면 문자열 시작주소를 넘겨주면 어떻게 될까??

문자열이 출력된것을 볼 수 있다. 이런 결과가 나오는 이유는??

우선 s1은 사실 "abc\0"로 메모리에 저장되있다.

그리고 넘겨준것은 문자열의 시작주소이기 때문에 생각외로 문자열이 정상 출력된 것이다.

 

만약 인자로 &s1[1]을 넘겨준다면??

 

 

const char* s1 = "abc"

하면 어떻게 될까??

s1이 가리키는 대상 또한 바꾸지 못한다. 완전한 상수가 되는 것이다.

 

 

반응형