C언어 프로그램 문자열과 포인터
C언어 프로그램 문자열과 포인터
■ 문자열을 선언하는 일반적인 방식은 다음과 같이 배열에 char 변수를 저장하는 방법일 것이다.
char ch[]="Hello!";
이때 배열의 길이는 자동으로 초기화되기 때문에 신경 쓰지 않아도 되고,이는 변수들을 모아놓은 배열이다. 그렇기 때문에 그 변수에 저장된 값들을 변경할 수가 있는데 간단하게 확인해본다.
▲ 먼저 ch 배열로 문자열을 저장한 후 출력하고 있으며 문자열의 여섯 번째 요소 ch[5]='!'에 접근해서 그 값을 '?'로 변경하고 있는데 프로그램 실행 결과를 보면 정상적으로 그 값이 바뀐 걸 확인할 수 있다. 이처럼 배열을 이용한 문자열은 저장된 값의 변경이 가능하다.
하지만 이번 글에서 알아볼 포인터는 그 안에 저장된 문자열 값을 변경하지 못한다는 결론을 먼저 내리고 정리해본다. 포인터도 역시 문자열을 가리킬 수 있다. 하지만 그 내용은 변경할 수 없는 상수 형태의 문자열을 가리키며 형식은 다음과 같다.
▲ 이 예제를 통해서 포인터도 문자열을 가리킬 수 있다는 걸 확인할 수 있다. 즉, Hello! 중에서 H의 주솟값을 aa 포인터 변수에 저장하고 있는 것이다. 그렇기 때문에 aa로 접근해서 문자열을 변경할 수 없는 것이다. aa는 단지 H의 주소만 저장하고 있는데 어떻게 문자열을 변경할 수 있겠는가? 실제로 예제를 작성해 보면....
▲ 이렇게 포인터 변수로 접근해서 여섯 번째 요소인 '!'를 '?'로 변경하고 있다. 이 프로그램을 실행하면 컴파일은 된다. 하지만 실행 중간에 다음과 같은 상황을 맞게 된다.
▲ 원래 문자열인 "Hello!"는 정상 출력된다. 하지만 aa[5]='?';를 실행하는 과정에서 변경하지 못하고 프로그램이 종료되버린다. 이렇게 포인터도 문자열을 가리킬 수 있지만 그 값은 변경하지 못하는 상수형 문자열이다.
여기서 한 가지 더 정리해야 할 건 그 문자열의 값만 변경하지 못하는 것이지 다른 문자열을 가리킬 수는 있다.
▲ 이렇게 완전히 다른 문자열을 가리키게 할 수 있는 것이다. 기존에는 "Hello!" 중에서 'H'의 주소를 저장하고 있었다면 변경된 후에는 "Hi~!!"의 'H' 주소를 저장하게 되는 것이다.
정리하자면 포인터 변수도 문자열을 가리킬 수 있는데 그 안에 있는 요소 일부만 변경하지는 못하지만 다른 문자열을 가리키게 할 수는 있는 것이다.