210109 개발일지(33일차) - c언어 알아보기(3) : 포인터 등

고재개발·2021년 1월 10일
0

C Language

목록 보기
3/13

포인터(Pointer)

'*'는 어떤 메모리 주소에 있는 값을 받아오게 해준다. 이 연산자를 이용해서 포인터 역할을 하는 변수를 선언할 수 있다.
아래 코드에서 '*p'라는 포인터 변수에 '&n'(n의 주소)를 저장했다.
int *p에서 int는 '*p'가 int 자료형 변수를 가리킨다는 의미다..!
'p'가 가리키고 있는 건, 주소값이다!

#include <stdio.h>

int main(void)
{
   int n = 50;
   int *p = &n;
   printf("%p\n", p);
   printf("%i\n", *p);
}

실제 메모리에서 변수 p는 아래와 같이 저장 될 수 있는데, 그렇게 생각하지 않고 추상적으로 p가 n을 가리키고 있다고 생각하는 사고를 하자!

문자열(string)의 비밀

우리는 보통 아래와 같이 문자열 자료형을 만드는데, 위의 포인터 개념을 생각하면 비밀을 알아낼 수 있다.

char *s = "HI!";

여기서 's'라는 변수는 주소값을 저장한다. 무슨 주소값을 저장하느냐, 바로 H에 해당하는 주소값을 저장한다. 문자열의 끝은 \0이 위치한 곳이 나타나면 끝으로 인식한다. 이 역할은 printf에서 해주는 것이며, %s를 입력하면 그렇게 인식하는 것이다. wow 여기서 더 나아가 우리는 보통 s[0], s[1], s[2]는 각각 'H', 'I', '!'를 가리키는 것이라고 생각하고 활용하지만, 이는 Syntactic sugar였다!

printf("%p\n", &s[0]);
printf("%p\n", &s[1]);
printf("%p\n", &s[2]);
printf("%p\n", &s[3]);
//--------------------------이게 아니라
printf("%c\n", *s);
printf("%c\n", *(s+1));
printf("%c\n", *(s+2));
printf("%c\n", *(s+3));
//요 것이 정석이다.
profile
고재개발

1개의 댓글

comment-user-thumbnail
2021년 1월 11일

생각하는 사고 ! 오옷 !!

답글 달기