2015년 5월 7일 목요일

C/C++ 문자열과 포인터

 문자열의 이름은 사실은 포인터로서 문자열의 첫 문자가 저장되는 주소값(이것을 base address라고 한다.)을 가진다. 문자열은 다음과 같이 정의할 수 있다.

char str[6] = {‘h’,’e’,’l’,’l’,’o’,’\0’}; // 문자 배열
char str[] = “hello”; //(1) 초기화할 경우 일차 배열의 크기를 생략할 수 있다.
char *str = “hello”; //(2) 윗 줄과 완전히 동일하다.

위의 예에서 (1)과 (2)는 동일하며 str 이라는 문자열 이름은 “hello” 문자열의 첫 문자 ‘h’가 저장된 메모리의 주소이다. 따라서 다음과 같은 것들이 가능하다.

str[0] 은 *(str+0) 와 같고(혹은 *str) 문자 ‘h’이다.
str[1] 은 *(str+1) 와 같고 문자 ‘h’이다.
str[2] 은 *(str+2) 와 같고 문자 ‘e’이다.
….
str[4] 은 *(str+4) 와 같고 문자 ‘o’이다.
str[5] 은 *(str+5) 와 같고 널문자(‘\0’)’이다.

따라서 다음과 같은 연산도 가능하다.

char ca = *str; // char ca = str[0] 과 같다.
str[0] = ‘H’; // 첫 문자를 대문자 ‘H’로 바꾼다.
printf(“%s”, str); // “hello” 가 출력된다.
printf(“%s”, str+1); // “ello” 가 출력된다.

문자열변수에 다른 변수를 대입하는 것도 물론 가능하다.

char *s1=”Hello world.”, *s2;
s2 = s1+6;
printf(“%s”, s2);

이 프로그램을 실행시키면 “world”라고 출력될 것이다. 포인터 s2 는 ‘w’를 가리키고 있기 때문이다.


H
e
l
l
o

w
o
r
l
d
\0
offset
0
1
2
3
4
5
6
7
8
9
10
11

 이와 같이 문자열 변수는 사실  char형 포인터이고 문자열의 첫 문자가 저장된 곳의 주소라는 사실을 잘 이해해야 한다.


댓글 없음:

댓글 쓰기