6.5 문자열과 포인터     [doc]     [smts]

 문자열의 이름은 사실은 포인터로서 문자열의 첫 문자가 저장되는 주소값(이것을 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형 포인터이고 문자열의 첫 문자가 저장된 곳의 주소라는 사실을 잘 이해해야 한다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

8.2 구조체 필드의 초기화  (0) 2016.04.15
8.1 구조체의 정의  (0) 2016.04.15
6.4 배열과 포인터  (0) 2016.04.15
6.1 포인터 개요  (0) 2016.04.15
5장 연습문제  (0) 2016.04.11
Posted by 살레시오
,