포인터로 문자열 이해하기 (C)

Kim Jay·2023년 3월 15일
0
post-thumbnail

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]);
}

profile
넓이에 깊이 더하기

0개의 댓글