string s = "APPLE"
라는 코드는 사실
char *s = "APPLE"
과 같다.
변수 s는 문자(char)에 대한 포인터이다.
어떤 문자? "APPLE" 의 첫글자인 "A"이다.
즉, s는 A가 저장되어 있는 주소를 가리키는 포인터이다.
#include <stdio.h>
int main (void){
char *s = "APPLE";
printf("포인터 s: %p\n", s);
// 포인터 s가 가리키는 주소 = 첫글자 'A'의 주소
printf("s의 주소: %p\n", &s);
// 포인터 s의 주소
printf("%c: %p\n", s[0], &s[0]);
// 첫글자 'A'의 주소 = 포인터 s가 가리키는 주소
printf("%c: %p\n", s[1], &s[1]);
// 'P'의 주소
printf("%c: %p\n", s[2], &s[2]);
// 'P'의 주소
printf("%c: %p\n", s[3], &s[3]);
// 'L'의 주소
printf("%c: %p\n", s[4], &s[4]);
// 'E'의 주소
printf("%i: %p\n", s[5], &s[5]);
// '\0'의 주소
}
결과:
포인터 s
를 호출하면 s[0]
('A')의 주소를 가리키고 있음을 알 수 있다.포인터 s
가 가리키는 주소가 &s[0]
와 같을 뿐이라는 것이다.포인터 s
자체가 저장되어있는 주소는 0x7ffd751a3120 로 따로 있다. 이를 통해,
우리가 "APPLE"이라는 문자열이 저장되어 있는 string s를 호출하면
컴퓨터는 다음과 순서로 작업을 수행한다고 이해했다.
1) s의 주소로 간다. (0x7ffd751a3120)
2) s가 'A'가 있는 주소를 가리키고 있다. 그 주소로 간다. (0x42b2aa)
3) 그 주소에 저장되어 있는 char 값, 즉 'A'를 출력한다.
4) 그 다음 값 'P' 을 읽는다. (바로 옆 주소인 0x42b2ab)
5) 쭉쭉 읽는다.
6)\0
을 마주치면, 끝이라는 표시이므로 읽는 것을 멈춘다.
7) 결과적으로 "APPLE"이 출력되었다.
우리는 s를 포인터로 지정하였다.
s 자체는 s[0]의 주소를 가리키는 화살표에 불과하다.
당연히 그것이 포인터의 정의니깐......
이해를 더 명확히 하기 위해 다시 한 번 실습!
#include <stdio.h>
int main (void){
char *s = "APPLE";
printf("s가 가리키는 주소: %p\n", s);
printf("그 주소에 있는 값: %c\n", *s);
printf("s가 속한 주소: %p\n", &s);
printf("그 주소로 가면 나오는 값: %s\n", *&s);
// s 자체는 화살표와 같음.
// s가 있는 곳으로 가면 문자열을 읽는 주소로 가라는 화살표만 있는 거나 마찬가지
// 결국 화살표 따라가면 있는 s[0]부터 문자들을 읽게 됨.
printf("s[0] 값: %c\n",s[0]);
printf("s[0] 주소: %p\n",&s[0]);
printf("s[0] 주소에 있는 값: %c\n",*&s[0]);
}